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.");
}