我看到用户报告他们不能通过selenium WebDriver“单击”命令单击元素,并且可以通过执行脚本通过JavaScript单击来解决此问题。
Python中的示例:
element = driver.find_element_by_id("myid")
driver.execute_script("arguments[0].click();", element)
WebDriverJS /量角器中的示例:
var elm = $("#myid");
browser.executeScript("arguments[0].click();", elm.getWebElement());
问题:
为什么点击“通过JavaScript”在普通的WebDriver点击没有的情况下工作?何时发生这种情况,以及该解决方法(如果有)的缺点是什么?
我个人使用这种解决方法时没有完全理解为什么我必须这样做,以及它可能导致什么问题。
发布于 2018-03-01 09:38:02
对于WebDriver执行点击操作和在JavaScript中执行操作之间的区别,PhantomJS没有任何特定功能。
这两种方法之间的本质区别对所有浏览器都很常见,可以很简单地解释:
div透明的元素,但它的尺寸和zIndex设置完全覆盖了A.然后你告诉WebDriver点击A. WebDriver将会模拟点击以便B 首先收到点击。为什么?因为B覆盖A,并且如果用户尝试点击A,则B将首先获得事件。A是否最终会获得点击事件取决于B如何处理事件。无论如何,在这种情况下,WebDriver的行为与真实用户尝试点击A时的行为相同。A.click()。这种点击方法并不能重现用户尝试点击A时真正发生的事情。JavaScriptclick直接将事件发送给A,而B不会收到任何事件。正如我上面提到的,WebDriver会尽量模拟真实用户使用浏览器时发生的情况。事实是,DOM可以包含用户无法与之交互的元素,WebDriver不允许您单击这些元素。除了我提到的重叠情况外,这也意味着不可见的元素不能被点击。我在堆栈溢出问题中看到的一个常见情况是,尝试与已存在于DOM中的GUI元素进行交互,但只有在处理了其他元素时才可见。这有时会在下拉菜单中发生:您必须先点击按钮才能选择菜单项,然后调出下拉菜单。如果有人在菜单可见之前尝试点击菜单项,如果这个人然后试图用JavaScript来做,它将会工作,因为事件直接传递给元素,而不管可见性如何。
如果您使用Selenium来测试应用程序,我对这个问题的回答是“几乎从不”。总的来说,您的Selenium测试应该重现用户使用浏览器所做的事情。以下拉菜单为例:测试应该点击首先弹出下拉菜单的按钮,然后点击菜单项。如果因为按钮不可见而导致GUI出现问题,或者按钮未能显示菜单项或类似内容,则测试将失败,并且您将检测到该错误。如果您使用JavaScript来点击,您将无法通过自动测试检测到这些错误。
我说“几乎从不”,因为在使用JavaScript时可能会有例外。不过,它们应该非常少见。
如果您使用Selenium来抓取网站,那么尝试重现用户行为并不重要。所以使用JavaScript来绕过GUI不是一个问题。
https://stackoverflow.com/questions/-100007468
复制相似问题