【问题标题】:Selenium 3 Firefox .click() not workingSelenium 3 Firefox .click() 不工作
【发布时间】:2017-02-26 01:33:21
【问题描述】:

自从我升级到最新的 Selenium 版本后,我的 Firefox 驱动程序无法正常工作。无法通过搜索 Google/Stack 找到答案我希望这里有人有答案。

我已经构建了一个页面对象模型,用于登录网页、点击管理站点并填写用户名/密码 + 提交。此代码是为 Selenium 2.53.6 编写的,但仍适用于 IE 和 Chrome。 对我来说失败的部分是这行代码:

driver.find_element_by_xpath(locators["login.open"]).click()

定位器是:

locators["login.open"] = "//*[@href='//www.phptravels.net/admin']"

既然它在 IE 和 Chrome 中运行,那么我很困惑 Firefox 不能再.click() 了?

我的控制台中没有收到错误消息,只是没有单击管理站点按钮。这可能与 Selenium 3/geckodriver 的给定 Firefox 版本有关吗?

使用pip所有驱动程序都是最新的

我正在使用这个网站来练习我的 Selenium:http://phptravels.com/demo/

编辑 (1):我已尝试使用 Firefox 版本 48 和 49 - 仍然无法正常工作

编辑 (2):geckodriver 配置了 Firefox 二进制文件,但驱动程序仍未执行 .click()

from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary

binary = FirefoxBinary('path/to/binary')
driver = webdriver.Firefox(firefox_binary=binary)

编辑 (3):我使用 is_displayed() 检查 xpath 定位器是否存在该元素,它返回 True。所以我知道它可以找到元素。

编辑(4):1)按照建议尝试使用 Nightly 构建,但不起作用。 2) 尝试使用 find_element_by_link_text,也不起作用。 3) 尝试了各种版本的 geckodriver(10.0、11.0、11.1 用于所有版本的 32 位和 64 位)

编辑 (5):每次测试用例失败时,“Firefox 插件容器已停止工作”都会持续生成。

编辑 (6):问题的可能解决方案:我在另一个网站上进行了另一次测试,Firefox 成功执行了 .click()。在 .click() 失败的第一个目标网页上,有一个巨大的 javascript 会在您打开页面时运行。这可能会扰乱 geckodriver 在 javascript-heavy 页面上执行 .click() 的能力。

编辑 (7):将 .send_keys(Keys.RETURN) 与 Keys 库一起使用是可行的,但如果您使用的是 POM,则可能需要进行额外的重新配置。明确地做一些 time.sleep 会让你周围,但现在使用 Selenium 3 + Firefox/geckodriver 进行网络浏览器自动化仍然很脆弱。如果您需要测试 Firefox,请降级到上一个稳定版本 (2.53.6)(注意:最新版本的 Firefox 将无法使用)。

【问题讨论】:

  • 我有同样的问题(但使用 Java)。自从升级到 v3 以来,我在使用 geckodriver 时遇到了几个类似的问题。似乎有些链接可以通过这种方式点击,而另一些则拒绝点击。我使用 xpath 取得了一些成功,例如 //a[text()='linktext'] 而不是 By.linkText,但它并不一致。没有 API 方法可以知道点击是否成功。
  • 升级到 selenium 3 后,我也看到了这个问题(在 C# 中)。
  • RE:编辑#6。如果您在单击之前执行 Thread.Sleep(10000) 会发生什么,让页面稳定下来或其他什么。作为故障排除措施...
  • 我试过了,但没有用。不过谢谢你的建议。有时这实际上会有所帮助,但在这种情况下则不然。我也对所有元素进行了隐式等待,并且我尽量避免进行显式等待,因为这会减慢我的测试速度
  • 我在使用 Python 2.7 和 Selenium 3.0.2 和 gecko 驱动程序 0.11 和 Firefox Developer Edition 52.0a2 时也遇到了同样的错误。我四处走走:gist.github.com/mpasternak/f2840edea51c211d609daa7f17be614f。我调用 jQuery 来单击该项目,这样它就不必滚动到视图中,然后我忽略了某种木偶错误,它试图从 javascript 获取返回值。实际上,当我的 Selenium 库 (Splinter) 尝试打开“about:blank” URL 时,以前的 Firefox 会挂起,所以...

标签: python-3.x firefox selenium-webdriver geckodriver selenium3


【解决方案1】:

可以是this bug吗?

一周后我禁用了木偶(java):

capability.setCapability("marionette", false);

修复一切。不要问我为什么。

【讨论】:

  • 那个bug是我做的:-)。我很久以前就搬家了。如果有人可以确认禁用木偶有效,那么我会批准你的回答。
【解决方案2】:

我也面临与 selenium 3 FF 相同的问题,但能够与 JS 执行器和 Keys.RETURNKeys.ENTER 一起运行

使用 JS 执行器:

WebElement button = driver.findElement(By.cssSelector("input[value=btn]"));
((JavascriptExecutor) driver).executeScript("arguments[0].click();", button);

使用Keys.RETURNKeys.ENTER

driver.findElement(By.id("abc")).sendKeys(Keys.RETURN);
driver.findElement(By.id("abc")).sendKeys(Keys.ENTER);

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,但有时 .click 有效,有时则无效。它不能很好地处理切换到新打开的窗口,以及其他一些怪癖,导致在 Selenium 2.53.4 中通过的测试在 Chrome、Safari 和 IE 中通过 Selenium 3 在 FireFox 中失败。我知道这不是很具体,但我已经在其他地方发布了寻找具体问题。

    我正在使用 Ruby/Selenium/Capaybara。在使用 Selenium 3/Geckodriver/FF49 组合进行广泛测试后,我恢复到 Selenium 2.53.4/FF47.01。我的印象是 Selenium 3/Geckodriver 组合还不是很稳定,这可能包括也可能不包括 Capybara 与 Geckodriver 的兼容性。我很想错。我已经在互联网上搜索了任何有用的信息,但没有找到。

    然而,我确实从 Selenium 3 的发布博客公告中找到了这条注释:“Mozilla 在实现 W3C WebDriver 协议方面一直处于领先地位。从好的方面来说,这暴露了随着规范的发展而存在的问题,但这也意味着很难跟踪 Firefox 的支持,因为他们的工程努力是前瞻性的,而不是支持 Selenium WebDriver 使用的当前有线协议。目前,我们可以提供的最佳建议是让您尝试最新版本geckodriver 和 Selenium 一起使用。”

    【讨论】:

      【解决方案4】:

      我使用的是 GeckoDriver 的 v0.11.1 和 Selenium 的 v3.0 并且遇到了同样的问题。我的解决方法是将 By.XPath 而不是 By.LinkText 传递给 FindElement。正如 OP 所提到的,我在找到元素时得到了“真实”返回,它只是由于某种原因不会处理对它的点击。

       driver.FindElement(By.XPath("//something")).Click();
      

      【讨论】:

      • 我也在使用 Xpath,方式和你一样。奇怪的是它不起作用。您运行的是 32 位还是 64 位的 geckodriver?
      • @MSJ 64 位先生
      • 我也一样。但是,根据 Edit (6),geckodriver 似乎无法使用特定类型的 javascript 处理某些页面。在我测试的网页上,右下角有一个弹出式聊天功能。我怀疑它弄乱了 geckodriver
      • @MSJ 有趣的理论。在我们的页面上,我们有一个名为 WalkMe.js 的第三方 js 覆盖小部件。我想出了如何使用 JavascriptExecutor 使用单个特定的 javascript 行从 DOM 中销毁和删除它。也许这就是为什么它对我有用?尝试联系聊天小部件的作者,看看是否有针对它的 kill 命令。
      • 我想补充一点,我有一个类似的“.Click() is broken”问题,我为此提交了一个错误报告..github.com/mozilla/geckodriver/issues/324
      【解决方案5】:

      我现在也有同样的问题,我尝试使用 nightly build 并且它开始工作了,虽然我在尝试在它们准备好之前点击它们时遇到了问题,但这比 Selenium 本身更多是我的问题。

      当前的 nightly build 版本是 52.0a1,你可以找到它here

      默认情况下,FirefoxDriver 仍将使用您常规安装的 Firefox,因此您需要使用配置文件/选项/二进制文件创建驱动程序,我这样做(在 C# 中但在 Python 中应该非常相似);

      var binary = new FirefoxBinary(@"C:\Program Files (x86)\Nightly\firefox.exe"); Driver = new FirefoxDriver(binary, null);

      我认为在 Python 中可能是 FirefoxDriver(binary: binary),但不完全确定。请注意,从 Selenium 3 开始使用 FirefoxBinary 已过时,取而代之的是 FirefoxOptions,但它会让您暂时测试这是否是您的问题。

      【讨论】:

      • 嗨迪兰姆。比你的回复。我已经在我的代码中声明了 Firefox 二进制文件(根据 Edit (2))。我已经更新了一个代码示例。仍然无法正常工作。我正在等待 geckdo/marionette 的更新,因为我认为这可能会解决问题
      • 您是否尝试过使用夜间构建? @user2782743
      • 我刚刚尝试了夜间构建。我已经将二进制文件声明为每晚构建,但它仍然是一样的。它没有点击。我什至试图定位 Chrome 和 IE 定位之外的其他内容,但仍然没有 .click'ing
      猜你喜欢
      • 2023-01-19
      • 1970-01-01
      • 2020-02-09
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多