linux 上的 chromedriver NullPointerException 错误
chromedriver NullPointerException error on linux
我目前正在学习硒。我已经按照关于如何启动 selenium-chromedriver 的分步演练进行了操作。但是我在这里遇到这个错误,我不知道如何解决它。
以下是攻略给我的源代码。
package driverUtilities;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class DriverUtilities {
private static DriverUtilities instanceOfDriverUtilities;
private WebDriver driver;
public static DriverUtilities getInstanceOfDriverUtilities() {
if (instanceOfDriverUtilities == null) {
instanceOfDriverUtilities = new DriverUtilities();
}
return instanceOfDriverUtilities;
}
public WebDriver getDriver() {
if (driver == null) {
CreateDriver();
}
return driver;
}
private String GetDriverName() {
Properties config = new Properties();
String driverName = "";
try {
config.load(new FileInputStream("config.properties"));
} catch (FileNotFoundException e) {
System.out.println("Config file is not present");
e.printStackTrace();
} catch (IOException e) {
System.out.println("Error when loading config file");
e.printStackTrace();
}
for (String key : config.stringPropertyNames()) {
if (key.equals("browser")) {
driverName = config.getProperty(key);
}
}
return driverName;
}
private void CreateDriver() {
String driverName = GetDriverName();
switch (driverName) {
case "Google Chrome":
System.setProperty("webdriver.chrome.driver", "chromedriver");
this.driver = new ChromeDriver();
break;
case "Firefox":
System.setProperty("webdriver.gecko.driver", "geckodriver.exe");
this.driver = new FirefoxDriver();
break;
default:
break;
}
}
}
这是驱动实用程序class
package test;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import driverUtilities.DriverUtilities;
public class Mod08_Slide_16_Navigation_Commands {
@Test
public void navigationCommands() {
DriverUtilities myDriverUtilities = new DriverUtilities();
WebDriver driver = myDriverUtilities.getDriver();
System.out.println("Start the Test Case");
// Load the website - http://www.bbc.co.uk
driver.get("http://www.bbc.co.uk");
System.out.println("\nLoad the website - http://www.bbc.co.uk");
// Refresh the page
driver.navigate().refresh();
System.out.println("\nRefresh the page");
// Load the website - http://www.google.co.uk
driver.get("http://www.google.co.uk");
System.out.println("\nLoad the website - http://www.google.co.uk");
// Go back to the website - http://www.bbc.co.uk
driver.navigate().back();
System.out.println("\nGo back to the website - http://www.bbc.co.uk");
// Go forward to the website - http://www.google.co.uk
driver.navigate().forward();
System.out.println("\nGo forward to the website - http://www.google.co.uk");
// Close the browser window
driver.close();
System.out.println("\nClose the browser window");
System.out.println("\nEnd of Test Case \"Navigation Commands\"");
}
}
这是 java 测试 class 我正在努力完成
# Change the browser to use for testing purposes, accepted values are Google Chrome and Firefox
browser=Google Chrome
我还有 pom.xml 文件和一个 config.properties 文件,如果需要,我会分享它。
注意:我的假设是 setproperty 函数没有定位到 chromedriver 的正确路径。但是,我是 arch linux 用户,因此我不确定 setproperty 函数中的值是否设置为“chromedriver”或“/usr/bin/chromedriver”
注意 1:我已导航至 Eclipse IDE 的 .metadata,并在阅读一些 Whosebug 帖子后将其删除。但是,这没有用*
注 2:我是 Selenium 的新手,但是,我对 Java 有一些经验,并且理解当我声明一个变量但没有创建对象并分配它时会发生 nullpointerexception变量。
编辑 1:我已经包含了指定的 config.properties
我的一个建议是对驱动程序的创建进行硬编码(不使用 config.properties
),一旦代码正常工作,您就可以进行优化,例如基于关键值就像你在这里做的那样。为此,只需替换此行
WebDriver driver = myDriverUtilities.getDriver();
和
System.setProperty("webdriver.chrome.driver", "C:\Program Files\WebDrivers\chromedriver.exe");
WebDriver driver = new ChromeDriver();
显然,请确保 chromedriver.exe
的路径已为您的系统正确解析。顺便说一句,除非您的 Web 驱动程序位于代码项目的根文件夹中,否则该路径不正确。我会仔细检查情况是否如此。
我 运行 您的代码符合此建议并且有效。这告诉我您的 Web 驱动程序路径不正确,或者您的 config.properties
.
有问题
最后,这个循环也不正确
for (String key : config.stringPropertyNames()) {
if (key.equals("browser")) {
driverName = config.getProperty(key);
}
}
您不想遍历所有浏览器键。如果您有多个“密钥”,它将遍历它们并 return 找到最后一个。相反,您需要在加载属性文件后调用 getProperty()
:
String propValue = props.getProperty("browser");
然后,一旦你有了正确的 propValue
,你应该将它传递给你的交换机以正确实例化网络驱动程序。
switch(propValue) {
case "chrome":
this.driver = new ChromeDriver();
break;
case "firefox":
this.driver = new GeckoDriver();
break;
default:
// throw some exception here
throw new IllegalArgumentException(propValue + " is not a supported browser.");
}
我目前正在学习硒。我已经按照关于如何启动 selenium-chromedriver 的分步演练进行了操作。但是我在这里遇到这个错误,我不知道如何解决它。
以下是攻略给我的源代码。
package driverUtilities;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class DriverUtilities {
private static DriverUtilities instanceOfDriverUtilities;
private WebDriver driver;
public static DriverUtilities getInstanceOfDriverUtilities() {
if (instanceOfDriverUtilities == null) {
instanceOfDriverUtilities = new DriverUtilities();
}
return instanceOfDriverUtilities;
}
public WebDriver getDriver() {
if (driver == null) {
CreateDriver();
}
return driver;
}
private String GetDriverName() {
Properties config = new Properties();
String driverName = "";
try {
config.load(new FileInputStream("config.properties"));
} catch (FileNotFoundException e) {
System.out.println("Config file is not present");
e.printStackTrace();
} catch (IOException e) {
System.out.println("Error when loading config file");
e.printStackTrace();
}
for (String key : config.stringPropertyNames()) {
if (key.equals("browser")) {
driverName = config.getProperty(key);
}
}
return driverName;
}
private void CreateDriver() {
String driverName = GetDriverName();
switch (driverName) {
case "Google Chrome":
System.setProperty("webdriver.chrome.driver", "chromedriver");
this.driver = new ChromeDriver();
break;
case "Firefox":
System.setProperty("webdriver.gecko.driver", "geckodriver.exe");
this.driver = new FirefoxDriver();
break;
default:
break;
}
}
}
这是驱动实用程序class
package test;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import driverUtilities.DriverUtilities;
public class Mod08_Slide_16_Navigation_Commands {
@Test
public void navigationCommands() {
DriverUtilities myDriverUtilities = new DriverUtilities();
WebDriver driver = myDriverUtilities.getDriver();
System.out.println("Start the Test Case");
// Load the website - http://www.bbc.co.uk
driver.get("http://www.bbc.co.uk");
System.out.println("\nLoad the website - http://www.bbc.co.uk");
// Refresh the page
driver.navigate().refresh();
System.out.println("\nRefresh the page");
// Load the website - http://www.google.co.uk
driver.get("http://www.google.co.uk");
System.out.println("\nLoad the website - http://www.google.co.uk");
// Go back to the website - http://www.bbc.co.uk
driver.navigate().back();
System.out.println("\nGo back to the website - http://www.bbc.co.uk");
// Go forward to the website - http://www.google.co.uk
driver.navigate().forward();
System.out.println("\nGo forward to the website - http://www.google.co.uk");
// Close the browser window
driver.close();
System.out.println("\nClose the browser window");
System.out.println("\nEnd of Test Case \"Navigation Commands\"");
}
}
这是 java 测试 class 我正在努力完成
# Change the browser to use for testing purposes, accepted values are Google Chrome and Firefox
browser=Google Chrome
我还有 pom.xml 文件和一个 config.properties 文件,如果需要,我会分享它。
注意:我的假设是 setproperty 函数没有定位到 chromedriver 的正确路径。但是,我是 arch linux 用户,因此我不确定 setproperty 函数中的值是否设置为“chromedriver”或“/usr/bin/chromedriver”
注意 1:我已导航至 Eclipse IDE 的 .metadata,并在阅读一些 Whosebug 帖子后将其删除。但是,这没有用*
注 2:我是 Selenium 的新手,但是,我对 Java 有一些经验,并且理解当我声明一个变量但没有创建对象并分配它时会发生 nullpointerexception变量。
编辑 1:我已经包含了指定的 config.properties
我的一个建议是对驱动程序的创建进行硬编码(不使用 config.properties
),一旦代码正常工作,您就可以进行优化,例如基于关键值就像你在这里做的那样。为此,只需替换此行
WebDriver driver = myDriverUtilities.getDriver();
和
System.setProperty("webdriver.chrome.driver", "C:\Program Files\WebDrivers\chromedriver.exe");
WebDriver driver = new ChromeDriver();
显然,请确保 chromedriver.exe
的路径已为您的系统正确解析。顺便说一句,除非您的 Web 驱动程序位于代码项目的根文件夹中,否则该路径不正确。我会仔细检查情况是否如此。
我 运行 您的代码符合此建议并且有效。这告诉我您的 Web 驱动程序路径不正确,或者您的 config.properties
.
最后,这个循环也不正确
for (String key : config.stringPropertyNames()) {
if (key.equals("browser")) {
driverName = config.getProperty(key);
}
}
您不想遍历所有浏览器键。如果您有多个“密钥”,它将遍历它们并 return 找到最后一个。相反,您需要在加载属性文件后调用 getProperty()
:
String propValue = props.getProperty("browser");
然后,一旦你有了正确的 propValue
,你应该将它传递给你的交换机以正确实例化网络驱动程序。
switch(propValue) {
case "chrome":
this.driver = new ChromeDriver();
break;
case "firefox":
this.driver = new GeckoDriver();
break;
default:
// throw some exception here
throw new IllegalArgumentException(propValue + " is not a supported browser.");
}