Linux上的chromedriver NullPointerException错误

Posted

技术标签:

【中文标题】Linux上的chromedriver NullPointerException错误【英文标题】:chromedriver NullPointerException error on linux 【发布时间】:2022-01-22 03:33:42 【问题描述】:

我目前正在学习硒。我已经逐步完成了如何启动 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;
        
    


这是驱动程序类

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 测试类

# 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 并在阅读了一些 *** 帖子后将其删除。但是,这不起作用*

注意 2:我对 Selenium 完全陌生,但是我对 Java 有一些经验,并且了解当我声明一个变量但没有创建对象并将该变量分配给它时会发生 nullpointerexception。

编辑 1:我已包含指定的 config.properties

【问题讨论】:

你能把你的config.properties文件也发一下吗?有些东西告诉我这是你的问题。 您还应该将该属性更改为“chrome”而不是“Google Chrome”。 我回答你的问题了吗? 【参考方案1】:

我的一个建议是对驱动程序的创建进行硬编码(不带config.properties),一旦代码正常工作,您就可以进行优化,例如根据像您这样的键值动态创建 Web 驱动程序在这里做。为此,只需替换此行

WebDriver driver = myDriverUtilities.getDriver();

System.setProperty("webdriver.chrome.driver", "C:\\Program Files\\WebDrivers\\chromedriver.exe");
WebDriver driver = new ChromeDriver();

显然,请确保您的系统正确解析了chromedriver.exe 的路径。顺便说一句,除非您的 Web 驱动程序位于代码项目的根文件夹中,否则该路径是不正确的。我会仔细检查是否是这种情况。

我根据这个建议运行了您的代码,并且成功了。这告诉我要么您的网络驱动程序路径不正确,要么您的 config.properties 有问题。

最后,这个循环也不正确

    for (String key : config.stringPropertyNames()) 
        if (key.equals("browser")) 
            driverName = config.getProperty(key);
        
    

您不想循环浏览所有浏览器键。如果您有多个“键”,它将遍历它们并返回找到的最后一个。相反,您需要在加载属性文件后调用 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.");

【讨论】:

以上是关于Linux上的chromedriver NullPointerException错误的主要内容,如果未能解决你的问题,请参考以下文章

linux环境 安装chromedriver 和 phantomjs的方法

linux下chromedriver的安装

安装ChromeDriver

Selenium ChromeDriver On Dockers(Linux)无法关闭

kali linux卸载lnmp,kali下配置selenuim+chromedriver

chromedriver与chrome最新版本对应表 转自-河岸上的酸菜鱼 简书地址-https://www.jianshu.com/u/bbea92f78aca