7

由于我升级到最新的 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 将无法使用)。

4

5 回答 5

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 和硒在一起。”

于 2016-11-07T20:02:53.150 回答
3

可以是这个错误吗?

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

capability.setCapability("marionette", false);

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

于 2017-06-13T10:01:03.530 回答
1

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

 driver.FindElement(By.XPath("//something")).Click();
于 2016-11-04T22:39:38.323 回答
0

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

当前的夜间构建版本是 52.0a1,你可以在这里找到它。

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

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

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

于 2016-10-26T15:12:46.993 回答
0

我也面临与 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);
于 2017-05-24T04:07:10.907 回答