Selenium 3 Firefox .click()无效

时间:2016-10-17 06:49:03

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

由于我升级到最新的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)尝试按照建议的夜间构建,不工作。 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页面上执行.click()的能力。

编辑(7):使用带密钥库的.send_keys(Keys.RETURN),但如果您正在使用POM,则可能需要进行其他重新配置。明确地做一些时间。睡眠会让你解决,但是现在使用Selenium 3 + Firefox / geckodriver进行网页浏览器自动化仍然很脆弱。如果你需要测试Firefox,请降级到上一个稳定版本(2.53.6)(注意:最新版本的Firefox无法运行)。

5 个答案:

答案 0 :(得分:2)

我有同样的问题,但有时.click工作,有时则没有。它并没有处理好切换到新打开的窗口对我和其他一些怪癖导致测试在Selenium 2.53.4中通过并且在Chrome,Safari&中通过了Selenium 3。 IE在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。"

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

可以是this bug吗?

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

capability.setCapability("marionette", false);

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

答案 3 :(得分:0)

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

目前每晚构建版本为52.0a1,您可以找到here

默认情况下,FirefoxDriver仍会使用常规安装的Firefox,因此您需要使用profile / options / binary创建驱动程序,我这样做(在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的,但是它会让你测试这是否是你的问题。

答案 4 :(得分:0)

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

一起运行

使用JS Executor:

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);