提供上下文以防有人知道解决更大问题的替代方法。
问题背景
我正在率先为使用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)
(source)的功能(不遵循Actions
类的Builder设计模式,并假设点击是用鼠标左键,没有其他键( Ctrl , Shift , Alt )被按下。
我想找到处理点击的核心代码(特别是在Chrome,Firefox和Internet Explorer中),所以我可以尽可能地复制它,但是我发现自己迷失在深深的课堂中和接口......
创建新ClickAction
(source)(稍后执行)。执行此操作包括对Mouse
接口(source)的实例进行“click()”调用... aaaa并且我丢失了。我从generated JavaDoc看到这是由EventFiringMouse(source)或HtmlUnitMouse(source)实现的,但我不确定哪一个会是实现。我做了一个假设(基础很少)HtmlUnitMouse
会被使用,这让我进一步沿着兔子洞看HTMLUnit code from Gargoyle Software ......
总之,我完全迷失了。
任何指导都将非常感谢:)
研究
RemoteWebDriver
(source)是ChromeDriver
,FirefoxDriver
和InternetExplorerDriver
的子类。 答案 0 :(得分:3)
要点
Chrome,Firefox和Internet Explorer的驱动程序均为RemoteWebDrivers
。
这意味着Selenium执行的所有操作都会通过WebDriver
发送到浏览器(HttpRequest
)。
一旦浏览器收到请求,它就会以"本机事件"执行操作。或综合的。浏览器如何执行操作取决于浏览器的功能(可能还有标记选项)。
"本机"事件是操作系统级别的事件。
使用JavaScript执行合成执行的操作。 "自动化原子"使用 - 作为一个推断来自'原子',它们是执行低级动作的小而简单的功能。
参考文献
RemoteWebDriver
由ChromeDriver
,FirefoxDriver
,InternetExplorerDriver
,OperaDriver
和SafariDriver
分组。 (reference)
与浏览器或RemoteWebDriver服务器通信的WebDriver的所有实现都应使用通用的有线协议。此有线协议使用RESTful web service通过HTTP定义JSON。 (reference)
在WebDriver中,高级用户交互是通过直接模拟JavaScript事件(即合成事件)或让浏览器生成JavaScript事件(即本机事件)来提供的。本机事件更好地模拟用户交互,而合成事件与平台无关[...]应尽可能使用本机事件。 (reference)
浏览器自动化原子是供Selenium实现使用的构建块。通过在整个代码库中使用相同的部分,而不是在多个位置重新实现所需的功能,项目可以减少发现的错误数量,并可以简化添加新功能和驱动程序的过程。 (reference)
自动化原子
答案 1 :(得分:2)
wiki for the Selenium IE Driver表示它使用本机事件而不是JavaScript事件与浏览器进行交互。
由于InternetExplorerDriver仅限Windows,因此会尝试使用 所谓的" native"或OS级事件来执行鼠标和键盘 浏览器中的操作。这与使用模拟相反 用于相同操作的JavaScript事件。
除了点击使用JavaScript的click()
元素外。
IE驱动程序使用
.selected
处理这一个场景 Automation Atom,它实质上设置了onChange
属性 元素并模拟JavaScript中的{{1}}事件。