如何将 gecko 可执行文件与 Selenium 一起使用
Posted
技术标签:
【中文标题】如何将 gecko 可执行文件与 Selenium 一起使用【英文标题】:How to use the gecko executable with Selenium 【发布时间】:2016-10-13 15:10:06 【问题描述】:我正在使用带有 Selenium 2.53 的 Firefox 47.0。最近,它们成为 Selenium 和 Firefox 之间的一个错误,导致代码无法正常工作。一种解决方案是使用Marionnette 驱动程序。
我按照site 的说明将这个新驱动程序与 RemotWebDriver 一起使用,但我一直遇到错误:
警告 - 异常:线程“main”中的异常 org.openqa.selenium.WebDriverException:驱动程序可执行文件的路径必须由 webdriver.gecko.driver 系统属性设置;有关详细信息,请参阅https://github.com/jgraham/wires。最新版本可以从....下载。
到目前为止我尝试过的代码非常简单:
public class Test
static WebDriver driver;
static Wait<WebDriver> wait;
public static void main(String[] args) throws MalformedURLException
System.setProperty("webdriver.gecko.driver", "C:\\Selenium\\geckodriver.exe");
DesiredCapabilities cap = DesiredCapabilities.firefox();
cap.setCapability("marionette", true);
cap.setBrowserName("firefox");
driver = new RemoteWebDriver(new URL("http://192.168.117.135:5555/wd/hub"), cap);//true to enable the JS
wait = new WebDriverWait(driver, 3000);
final String url = "https://www.google.com/";
javascriptExecutor js = (JavascriptExecutor) driver;
try
driver.navigate().to(url);
finally
driver.close();
我确定 geckodriver.exe 的路径是正确的,但我看不出我在哪里做错了。
编辑 1: 我尝试了以下代码:
public class Test
static WebDriver driver;
static Wait<WebDriver> wait;
public static void main(String[] args) throws MalformedURLException
System.setProperty("webdriver.gecko.driver", "C:\\Selenium\\geckodriver.exe");
driver = new MarionetteDriver();
wait = new WebDriverWait(driver, 3000);
final String url = "https://www.google.com/";
JavascriptExecutor js = (JavascriptExecutor) driver;
try
driver.navigate().to(url);
finally
driver.close();
而且它正在工作,问题似乎来自 RemoteWebDriver 和壁虎驱动程序,你们有任何消息吗?
【问题讨论】:
【参考方案1】:您可以使用 WebDriverManager 自动处理 Firefox 驱动程序。
此库会为您的平台(Mac、Windows、Linux)下载正确的二进制文件 (geckodriver),然后导出所需 Java 环境变量 (webdriver.gecko.driver) 的正确值)。
看一个完整的例子作为JUnit测试用例:
public class FirefoxTest
private WebDriver driver;
@BeforeClass
public static void setupClass()
WebDriverManager.firefoxdriver().setup();
@Before
public void setupTest()
driver = new FirefoxDriver();
@After
public void teardown()
if (driver != null)
driver.quit();
@Test
public void test()
// Your test code here
如果您使用的是 Maven,则必须输入您的 pom.xml
:
<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>5.0.1</version>
</dependency>
WebDriverManager 为您创造奇迹:
-
它检查最新版本的 WebDriver 二进制文件
如果您的系统上没有 WebDriver 二进制文件,它会下载它
它导出 Selenium 所需的 WebDriver Java 环境变量
到目前为止,WebDriverManager 支持Chrome
、Opera
、Internet Explorer
、Microsoft Edge
、PhantomJS
和Firefox
。
【讨论】:
【参考方案2】:最近 Selenium 推出了 Selenium 3,如果您尝试使用 Firefox 最新版本,那么您必须使用 GeckoDriver:
System.setProperty("webdriver.gecko.driver","G:\\Selenium\\Firefox driver\\geckodriver.exe");
WebDriver driver = new FirefoxDriver();
You can check full documentation from here
【讨论】:
这个解决方案显然与 Windows 相关联(因为路径)。是否有独立于平台的方法来执行此操作,或者是否需要为每台运行 Selenium 3 代码的机器进行设置? 我们倾向于做的是有一个conf。特定于环境的文件(测试机器 IP、各种端口、路径等)并按原样使用它,但是不,我对必须指定可执行文件的路径才能运行测试感到不满意。如果有人有更好的想法,我将不胜感激。 对于 mac,您可以从这里下载 webdriver:github.com/mozilla/geckodriver/releases。还设置像这样的属性 System.setProperty("webdriver.gecko.driver", "/Users/gecko/geckodriver");【参考方案3】:如本文所述,我正在使用 FirefoxOptions 类设置 Firefox 52.0、GeckoDriver v0.15.0 和 Selenium 3.3.1 的二进制位置 - http://www.automationtestinghub.com/selenium-3-0-launch-firefox-with-geckodriver/
我使用的java代码-
FirefoxOptions options = new FirefoxOptions();
options.setBinary("C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe"); //location of FF exe
FirefoxDriver driver = new FirefoxDriver(options);
driver.get("http://www.google.com");
【讨论】:
没有一个关于geckodriver.exe
的字眼,应该像 Mukesh otwani 的回答所暗示的那样使用它。
不推荐使用3.3.1
Selenium 驱动,因为specific issues。为了避免更好地使用3.4.0
。【参考方案4】:
上述解决方案适用于本地测试和从 java 代码启动浏览器。如果您想稍后启动 selenium 网格,那么这个参数是必须的,以便告诉 远程节点在哪里可以找到 geckodriver:
-Dwebdriver.gecko.driver="C:\geckodriver\geckodriver.exe"
在自动化 Java 代码中指定时,节点找不到 gecko 驱动程序。
因此,节点的完整命令应该是(假设用于测试目的的节点和集线器位于同一台机器上):
java -Dwebdriver.gecko.driver="C:\geckodriver\geckodriver.exe" -jar selenium-server-standalone-2.53.0.jar -role node -hub http://localhost:4444/grid/register
您应该会在节点日志中看到:
00:35:44.383 INFO - Launching a Selenium Grid node
Setting system property webdriver.gecko.driver to C:\geckodriver\geckodriver.exe
【讨论】:
给定的语法在较新的 selenium-server 版本(如 3.2.0)中抛出异常:线程“main”中的异常 com.beust.jcommander.ParameterException:未知选项:-Dwebdriver.gecko.driver =geckodriver.exe at com.beust.jcommander.JCommander.parseValues(JCommander.java:742) ...为避免这种情况,您需要更改参数顺序(首先是属性声明,jar 和程序参数。之后)。示例:java -Dwebdriver.gecko.driver="./geckodriver.exe" -jar selenium-server-standalone-3.2.0.jar -role node -hub 10.64.201.100:4444/grid/register【参考方案5】:请务必记住,驱动程序(文件)必须具有执行权限(linux chmod +x geckodriver)。
总结一下:
-
下载壁虎驱动
添加执行权限
添加系统属性:
System.setProperty("webdriver.gecko.driver", "FILE PATH");
实例化并使用类
WebDriver driver = new FirefoxDriver();
随心所欲
关闭驱动
driver.close;
【讨论】:
【参考方案6】:这可能是由于系统在路径上找不到 firefox 安装位置。
试试下面的代码,应该可以的。
System.setProperty("webdriver.firefox.bin","C:\\Program Files\\Mozilla Firefox\\firefox.exe");
System.setProperty("webdriver.gecko.driver","<location of geckodriver>\\geckodriver.exe");
【讨论】:
【参考方案7】:我尽量简化。使用 Selenium 3+ 时有两种选择:
将 Firefox 升级到 47.0.1 或更高版本并使用默认 Selenium3 的 geckodriver。
或通过将 marionette
指定为 false 来禁用 geckodriver
并使用旧版 Firefox 驱动程序。运行 selenium 的简单命令
是:java -Dwebdriver.firefox.marionette=false -jar
selenium-server-standalone-3.0.1.jar
。您也可以禁用使用
geckodriver 来自其他答案中提到的其他命令。
【讨论】:
谢谢,这对我尝试在 Debian 上设置 codeception 并安装了 iceweasel 很有用。【参考方案8】:我通过archetype maven-archetype-quickstar创建了一个简单的Java应用,然后修改pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>bar</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>bar</name>
<description>bar</description>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.0.0-beta3</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-server</artifactId>
<version>3.0.0-beta3</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-api</artifactId>
<version>3.0.0-beta3</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-firefox-driver</artifactId>
<version>3.0.0-beta3</version>
</dependency>
</dependencies>
<build>
<finalName>bar</finalName>
</build>
</project>
和
package bar;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class AppTest
/**
* Web driver.
*/
private static WebDriver driver = null;
/**
* Entry point.
*
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException
// Download "geckodriver.exe" from https://github.com/mozilla/geckodriver/releases
System.setProperty("webdriver.gecko.driver","F:\\geckodriver.exe");
driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://localhost:8080/foo/");
String sTitle = driver.getTitle();
System.out.println(sTitle);
您还可以在 Mac OS X、Linux 上使用:https://github.com/mozilla/geckodriver/releases
和
// On Mac OS X.
System.setProperty("webdriver.gecko.driver", "/Users/donhuvy/Downloads/geckodriver");
【讨论】:
我已尝试使用给定的 set 属性行,但我无法在 mac 机器上启动 Firefox 浏览器。【参考方案9】:我也面临同样的问题,一天后得到了解决:
异常即将到来,因为系统需要 Geckodriver 来运行 Selenium 测试用例。 您可以在 Java 中的 main 方法下尝试此代码
System.setProperty("webdriver.gecko.driver","path of/geckodriver.exe");
DesiredCapabilities capabilities=DesiredCapabilities.firefox();
capabilities.setCapability("marionette", true);
WebDriver driver = new FirefoxDriver(capabilities);
有关更多信息,您可以访问此https://developer.mozilla.org/en-US/docs/Mozilla/QA/Marionette/WebDriver 链接。
如果问题没有得到解决,请告诉我。
【讨论】:
谢谢...我在您的第 4 行收到Caused by: java.net.ConnectException: Connection refused: connect
...知道这可能是什么吗?
据我了解,远程拒绝连接时会出现 ConnectException。您是否在 line1 中为 geckodriver 提供了正确的路径?
哈!谢谢...终于让它工作了。谢谢你把宝贵的一天花在这上面……我想知道“壁虎”、“木偶”和“能力”的全部内容是什么?以及为什么使用 Selenium 3.0.0 如此重要?【参考方案10】:
在启动 Selenium 服务器节点时,您需要使用 .exe 的路径指定系统属性。另请参阅Selenium grid with Chrome driver (WebDriverException: The path to the driver executable must be set by the webdriver.chrome.driver system property)
的已接受答案【讨论】:
以上是关于如何将 gecko 可执行文件与 Selenium 一起使用的主要内容,如果未能解决你的问题,请参考以下文章
如何在 selenium 3 中关闭 Marionette/gecko 驱动程序日志
java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.gecko.driver 系统属性设置
如何通过 Java 使用 Selenium 将功能和选项传递给 Firefoxdriver
使用 BrowserMobProxy、Selenium、Firefox、marionette/gecko 获取请求和响应
使用 Gecko 驱动程序运行我的 Selenium 脚本时出现“org.openqa.selenium.WebDriverException: Unsupported Marionette prot