Selenium WebElement.click() 与 Javascript 点击事件
Posted
技术标签:
【中文标题】Selenium WebElement.click() 与 Javascript 点击事件【英文标题】:Selenium WebElement.click() vs. Javascript click event 【发布时间】:2014-08-25 14:25:53 【问题描述】:我想知道调用 WebElement 的 click()
方法与通过 id 查找元素并使用 javascript 触发 click
事件之间有什么区别。
为了清楚起见,我在第一种方法中调用了WebElement 实例的.click()
:
myWebElement.click();
第二种技巧是:
((JavascriptExecutor)driver).executeScript("document.getElementById('myElementID').click()");
我有兴趣了解这两种点击网络元素的技术之间的所有差异,以及每种技术的优缺点。
【问题讨论】:
【参考方案1】:Webdriver 利用浏览器的原生支持,使用 id/xpath 等将 DOM 元素映射到 WebElement 对象。
JavascriptExecutor.executeScript
在当前所选浏览器窗口的上下文中执行外部 脚本。 (类似于 grease monkey 之类的增强型浏览工具,如果您曾经使用过),
如果脚本返回任何转换为 WebElement 对象的 DOM 元素。
也可以说,WebDriver 在浏览器上模拟的点击与使用 javascript 调用的点击相比,与实际用户所做的类似。
实际上,使用 WebDriver 并非所有事件都可以在所有 Web 浏览器上完美自动化,事实上,对于同一 Web 浏览器的不同版本也是如此。 (即不同版本的 IE、FF 等行为不同)。 WebDriver 仍然是可用于此的最佳工具。
有一次(大约 4 年前)在某个版本的 IE 上,我们观察到我们无法发送右键单击或者可能将鼠标悬停在生成的菜单链接上,因此我们使用 js 来模拟这种情况,这与浏览器无关大大地。所以您现在可以得出结论,执行外部 javascript 有什么好处。
此外,还有一些自动化 Web 测试框架,它使用 javascript 来代替浏览器的原生支持。例如:http://en.wikipedia.org/wiki/Sahi_%28software%29
参考:
http://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/JavascriptExecutor.html#executeScript%28java.lang.String,%20java.lang.Object...%29 http://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/WebDriver.html#findElement%28org.openqa.selenium.By%29【讨论】:
谢谢,让我们回到我的示例,假设我们有一个未启用的按钮(例如,带有角度)。我认为如果我使用第一种技术 (WebElement.click()) 什么都不会发生,而如果我使用第二种技术,它将绕过按钮被禁用并触发点击操作的事实,对吗?跨度> 我怀疑如果按钮已被禁用,您是否可以单击该按钮。记住它仍然是同一个 DOM 中的同一个按钮 如果您有 Firefox,然后在其中加载您的页面(带有禁用按钮),然后转到tools->Web Developers->Scratchpad
。这将打开一个小的暂存器窗口。将您的脚本复制到其中document.getElementById('myElementID').click()
。然后单击Run
按钮,然后自己检查会发生什么。 :)
实际上我可以从开发者工具中做到这一点-> chrome 和 firefox 的控制台,是的,你是对的!【参考方案2】:
这类测试是E2E(端到端)而不是BDD。
第一个 - 现在执行,要采取下一步行动,您必须编写一些延迟执行的函数,例如从服务器下载新数据。
第二个代码返回promise
- http://selenium.googlecode.com/git/docs/api/javascript/class_webdriver_WebElement.html - „安排一个命令来点击这个元素。“ – 您可以使用 then 回调来运行下一个操作。
【讨论】:
以上是关于Selenium WebElement.click() 与 Javascript 点击事件的主要内容,如果未能解决你的问题,请参考以下文章
selenium测试为啥要启动selenium server
Selenium-IDE,Selenium-RC ,Selenium grid以及 Selenium-Core