当前位置: 首页 > 面试题库 >

Python-WebDriver click()与JavaScript click()

臧翰采
2023-03-14
问题内容

在StackOverflow上,我看到用户报告说他们无法通过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());

问题:

为什么在常规WebDriver单击不起作用时单击“通过JavaScript”有效?这到底是什么时候发生的,这种解决方法(如果有)的缺点是什么?

我个人使用此变通办法时并未完全理解为什么必须这样做以及它可能导致什么问题。


问题答案:

与当前接受的答案所暗示的相反,PhantomJS并没有特定于WebDriver单击和使用JavaScript的区别。

区别

两种方法之间的本质区别是所有浏览器都共有的,可以很简单地解释一下:

  • WebDriver:当WebDriver进行单击时,它会尽可能地尝试模拟真实用户使用浏览器时发生的情况。假设你有一个元素A,它是一个表示“单击我”的按钮,一个元素B是一个div透明的元素,但具有其尺寸和zIndex设置,使其完全覆盖A。然后告诉WebDriver单击A。WebDriver将模拟点击,使B 首先获得点击。为什么?因为B涵盖了A,并且如果用户尝试单击A,则B将首先获得该事件。A是否最终会获得click事件取决于B如何处理该事件。无论如何,在这种情况下,WebDriver的行为与真实用户尝试单击A时的行为相同。

  • JavaScript:现在,假设你使用JavaScript来做A.click()。这种单击方法不能重现用户尝试单击A时实际发生的情况。JavaScript将click事件直接发送给A,而B将不会获得任何事件。

为什么在WebDriver单击不起作用时JavaScript单击有效?

正如我上面提到的,WebDriver会尽可能地模拟真实用户使用浏览器时发生的情况。事实是,DOM可以包含用户无法与之交互的元素,并且WebDriver不允许你单击这些元素。除了我提到的重叠情况之外,这还意味着无法单击不可见元素。我在“堆栈溢出”问题中看到的一个常见情况是有人试图与DOM中已经存在的GUI元素进行交互,但是只有在处理了其他某些元素后才可见。有时在下拉菜单中会发生这种情况:你必须先单击按钮,然后弹出菜单,然后才能选择菜单项。如果有人尝试在菜单可见之前单击菜单项,如果此人随后尝试使用JavaScript进行操作,那么它将起作用,因为事件是直接传递给元素的,而与可见性无关。

什么时候应该使用JavaScript进行点击?

如果你使用Selenium来测试应用程序,那么我对这个问题的回答是“几乎不会”。总的来说,你的Selenium测试应该重现用户对浏览器的操作。以下拉菜单为例:测试应单击首先显示下拉菜单的按钮,然后单击菜单项。如果由于按钮不可见而导致GUI出现问题,或者按钮无法显示菜单项或类似内容,则测试将失败并且你将检测到该错误。如果使用JavaScript单击鼠标,则将无法通过自动测试检测到这些错误。

我说“几乎从不”是因为使用JavaScript可能会有例外。但是,它们应该很少见。

如果你使用Selenium 抓取站点,则尝试重现用户行为并不那么重要。因此,使用JavaScript绕过GUI并不是什么大问题。



 类似资料:
  • 问题内容: 关于Python和CPython (Jython,IronPython) 的所有这些大惊小怪,我不明白: python.org提到CPython是: Python的“传统”实现(绰号为CPython) 另一个堆栈溢出问题提到: CPython是Python的默认字节码解释器,它是用C编写的。 老实说,我并没有理解这两种解释的实际含义,但是我认为, 如果我使用CPython,这意味着当我

  • 本文向大家介绍Python与Ruby,包括了Python与Ruby的使用技巧和注意事项,需要的朋友参考一下 让我们看看Python和Ruby之间的主要区别。 Python Ruby 它支持书写功能 它不支持书写功能 Web框架,例如Django,Flask,Bottle等。, Web框架,例如Ruby on Rail,Hanami,Sinatra等, Python不支持mixins Ruby支持m

  • 首先要明确的是处理面向对象,还有很多编程语言范式,Python 本身就是一个支持面相对象和函数式编程的多范式编程语言。 编程范式的存在是为了解决的代码复用和共享问题。 JavaScript 主要是一门面向原型的编程语言,但是吸收了众多函数式编程的思想,却缺乏常见的函数式编程基础功能。 const 与常量 在 ES5 及之前的规范中,JS 声明对象时只能使用 var,ES6 中新增了 const 和

  • 问题内容: 我今天刚刚与一些同事讨论了python的db-api fetchone vs fetchmany vs fetchall。 我确定每个应用程序的用例都取决于我正在使用的db-api的实现,但是总的来说,fetchone,fetchmany,fetchall的用例是什么? 换句话说,以下等效项是什么?还是其中之一比其他人更受青睐?如果是这样,在哪些情况下? 问题答案: 我认为这确实取决于

  • 问题内容: 我似乎很难解决这个问题。 和之间有什么区别? 说我有一个不带tzinfo的附件,两个不应该给出相同的输出吗?难道它们都没有给出从纪元到传递的日期之间的秒数吗?而且由于通过的日期没有tzinfo,所以秒数不一样吗? 问题答案: 假定传递的元组在本地时间,假定在GMT / UTC中。根据解释,元组表示不同的时间,因此函数返回不同的值(由于历元是基于UTC的秒数)。 值之间的差异应等于您当地

  • 问题内容: 我想在我的多线程Python应用程序中定期执行操作。我已经看到了两种不同的方法 要么 一种方法比另一种方法有优势吗?是使用更少的资源还是与其他线程和GIL更好地协作?哪一个使我的应用程序中的其余线程响应更快? (假设有一些外部事件集或,我愿意在关闭时等待完整的延迟) 问题答案: 使用将具有更高的响应速度,因为在设置时,您将立即退出while循环。使用,即使在设置了事件之后,您也将在通话

  • 问题内容: 如果我使用MySQLdb通过Python连接到MySQL-Server。我创建一个和这样的: 完成MySQL处理后,应关闭。现在我在想:通过执行以下操作是否足以关闭: 还是我必须先关闭然后再关闭?像这样: 问题答案: 使用,此工具可让您创建一个临时游标,一旦返回上一个缩进级别,该游标将关闭。

  • 我一直在尝试在我的Windows 64位笔记本电脑上安装Python包,因为我想使用的另一个包需要它。这个包还需要Python3.6,因此在我的计算机上,我有Python2.7和3.6,并使用和来区分两者。在执行时,一切都会正常安装,但在使用时,我会出现以下错误: 我尝试通过如下方式克隆存储库来解决此问题: 然后给出以下错误 然后,我通过在 简单地让库成为64位的库 但这再次给出了一个错误: 在这