【问题标题】:java.lang.ExceptionInInitializerError while working with chromedriver and chrome on linux在 Linux 上使用 chromedriver 和 chrome 时出现 java.lang.ExceptionInInitializerError
【发布时间】:2018-08-06 19:25:33
【问题描述】:

我正在 Windows 10 机器上创建测试(UI 测试)。它们运行良好,但几天前我的老板告诉我,我们需要在 linux 上运行我们的测试。我已下载 linux 驱动程序并将其更改为 System.setProperty("webdriver.chrome.driver", "chromedriver"); 但在尝试运行此测试后我得到了 java.lang.ExceptionInInitializerError(它是最新浏览器的最新驱动程序)。之后我更改了允许我运行测试的代码,但与驱动程序的连接是远程的。我不喜欢这种方式。可能有人知道哪个驱动程序可以在 linux 上运行而无需更改驱动程序初始化部分的代码?

例如 windows驱动初始化:

private static WebDriver driver = new ChromeDriver();
private static WebDriverWait wait = new WebDriverWait(driver, 30);
@Given("^blah blah$")
public void some_method() {
    System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
}

linux驱动初始化:

public abstract class InitDrivers{
    private static DesiredCapabilities capability = DesiredCapabilities.chrome();
    public  static WebDriver driver;
    static {
        try {
            driver = new RemoteWebDriver(new URL("http://127.0.0.1:9515"),capability);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }
    public static WebDriverWait wait = new WebDriverWait(driver, 30);

public class CallDoctorTestStep extends InitDrivers{
@Given("^blah blah$")
public  void some_method() throws MalformedURLException{
    //System.setProperty("webdriver.chrome.driver","chromedriver.exe");
}

请参阅Selenium NoSuchSession on linux中的解决方案

【问题讨论】:

  • 你的linux代码不就是用selenium-grid吗?
  • @ChukUltima 不,我不使用硒网格

标签: java linux selenium selenium-webdriver selenium-chromedriver


【解决方案1】:

java.lang.ExceptionInInitializerError

java.lang.ExceptionInInitializerError 表示在 静态初始化程序 中发生了意外异常。抛出此错误表示在计算静态初始化程序或静态变量的初始化程序期间发生了异常。

如果静态初始化程序块出现问题,则会引发 ExceptionInInitializerError。下面是一个例子:

class Anton
{
  static
  {
     // if something goes wrong ExceptionInInitializerError will be thrown
  }
}

静态变量在静态块中初始化,可能会引发这些错误。


问题:

  • 在您的 Linux 驱动程序初始化 代码块中,您最初提到过:

    private static DesiredCapabilities capability = DesiredCapabilities.chrome();
    
  • 然后调用 RemoteWebDriver 如下:

    driver = new RemoteWebDriver(new URL("http://127.0.0.1:9515"),capability);
    
  • 但在以下步骤中,您再次尝试:

    System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
    

这一系列事件会产生错误。

解决办法:

  • 正如您已经将 WebDriver 实例声明为:

    public  static WebDriver driver;
    
  • 接下来,使用System.setProperty()

    System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver"); // <- remove the .exe part here following Linux style
    
  • 现在你需要初始化RemoteWebDriver实例如下:

    driver = new RemoteWebDriver(new URL("http://127.0.0.1:9515"),capability);
    
  • 作为 WebDriver 实例(即static)和 Web 浏览器 实例现在处于活动状态,您不能在 Test 期间更改属性执行

注意:详细讨论可以在exception in initializer error

【讨论】:

  • 1)System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver"); // &lt;- remove the .exe part here following Linux style这部分有评论。它不使用 2) 我的 linux 代码运行良好。 3) 我需要在更改System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver/for_linux");' 后可以工作的 linux 驱动程序如果我现在这样做,它会抛出我ExceptionInInitializerError
  • 为什么要在 linux 驱动程序 开始工作后更改System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver/for_linux");?如果它是一个单独的用例,具有不同的环境设置quit()驱动程序并启动一个新的。
  • 似乎我们无法相互理解:^) 在 Windows 机器上,我在 linux 上使用 //System.setProperty("webdriver.chrome.driver","chromedriver.exe");,我尝试了 System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver/for_linux");,但它在 linux 上不起作用。为了System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver/for_linux"); 我应该做的事情会起作用
  • 由于 Windows 安装程序正在运行,请省略与 Windows 相关的讨论。指定您在 Linux 系统 上遇到的问题。
最近更新 更多