从技术角度来看,Selenium如何点击网页上的元素?

Eil*_*idh 19 selenium web-component polyfills selenium-webdriver remotewebdriver

如果有人知道解决更大问题的替代方法,则提供上下文.


问题背景

我正率先为使用Web组件的Web应用程序开发测试自动化框架.这在Internet Explorer中进行测试时出现了问题,因为Internet Explorer本身不支持Web组件; 相反,polyfill用于提供此功能.

对此的主要反应是,Selenium的大部分将无法按预期工作.它无法像在Firefox和Chrome中那样"看到"Internet Explorer中的Shadow DOM.

另一种方法是编写一个测试框架,它提供了一种通过JavaScript访问元素的替代机制 - 这允许元素通过polyfill定位.

我们当前的实现检查WebDriver正在使用的,并使用方法的原始Selenium实现(在Chrome或Firefox的情况下),或者我们自己的替代实现(在Internet Explorer的情况下).

这意味着我们希望我们的实现尽可能接近Selenium的实现,其核心是浏览器交互级别.


问题

我试图复制的功能Actions.click(WebElement onElement)(),以简化形式(不继的生成器设计模式Actions类,并使得假设该点击是与鼠标左键并没有其他按键(Ctrl,Shift,Alt)正在举行下).

我想找到处理点击的核心代码(特别是在Chrome,Firefox和Internet Explorer中),所以我可以尽可能地复制它,但是我发现自己迷失在类和接口的深层. ..

创建一个新的ClickAction()(以后执行).执行此操作包括对Mouse接口实例()进行"click()"调用... aaaa并且我丢失了.我从生成的JavaDoc中看到,它是由EventFiringMouse(源代码)或HtmlUnitMouse(源代码)实现的,但我不确定将实现哪一个.我做了一个假设(没什么基础)HtmlUnitMouse可以使用,这让我进一步深入兔子洞看Gargoyle Software的HTMLUnit代码 ......

简而言之,我完全迷失了.

任何指导将不胜感激:)


研究

  • 我发现我认为ChromeUnit,Firefox和Internet Explorer使用HTMLUnit是不正确的.文档显示RemoteWebDriver()由子类ChromeDriver,FirefoxDriverInternetExplorerDriver.

Eil*_*idh 3

要点

Chrome、Firefox 和 Internet Explorer 的驱动程序都是RemoteWebDrivers.

这意味着 Selenium 执行的任何操作都会WebDriver通过HttpRequest.

一旦浏览器收到请求,它将作为“本机事件”或综合执行操作。浏览器如何执行操作取决于浏览器的功能(以及可能的标志选项)。

“本机”事件是操作系统级别的事件。

综合执行的操作是使用 JavaScript 执行的。使用“自动化原子”——正如人们从“原子”推断的那样,它们是执行低级操作的小而简单的函数。


参考

  • RemoteWebDriverChromeDriverFirefoxDriverInternetExplorerDriverOperaDriver和进行子类化SafariDriver。(参考

  • 与浏览器或 RemoteWebDriver 服务器通信的所有 WebDriver 实现都应使用通用有线协议。该有线协议使用JSON over HTTP 定义了RESTful Web 服务。(参考

  • 在WebDriver 中,高级用户交互是通过直接模拟JavaScript 事件(即合成事件)或让浏览器生成JavaScript 事件(即本机事件)来提供的。本机事件可以更好地模拟用户交互,而合成事件是独立于平台的 [...] 应尽可能使用本机事件。(参考

  • 浏览器自动化原子是旨在供 Selenium 实现使用的构建块。通过在整个代码库中使用相同的部分,而不是在多个地方重新实现所需的功能,该项目可以减少发现的错误数量,并可以简化添加新功能和驱动程序的过程。(参考


自动化原子