Selenium-在不修改PATH的情况下运行ChromeDriver

时间:2018-11-21 18:05:17

标签: java selenium selenium-webdriver selenium-chromedriver

我正在尝试使用Selenium for Java创建一个简单的框架。尝试进行此设置的一个不幸方面是,我无权在Windows计算机上编辑SYSTEM级别的变量。

在尝试运行仅试图访问网站的单个JUnit测试,然后断言它位于我所指向的页面上时,我不断收到错误消息,指出必须设置ChromeDriver可执行文件的路径。我确实已在本地下载了此内容。

Private Sub UpdateStatus()
    If Not ApplicationForm Is Nothing Then
        If ApplicationForm.InvokeRequired Then
            Dim UpdateInvoker As New MethodInvoker(AddressOf UpdateStatus)

            Try
                ApplicationForm.Invoke(UpdateInvoker)
            Catch ex As Exception
                Dim InvokeError As New ErrorHandler(ex)

                InvokeError.LogException()
            End Try
        Else
            UpdateApplicationProgress()
        End If
    End If
End Sub

Private Sub UpdateApplicationProgress()
    Dim Changed As Boolean = False

    If Not ApplicationForm Is Nothing Then
        With ApplicationForm
            If Not CurrentStatusText Is Nothing Then
                If Not ApplicationStatusLabel Is Nothing Then
                    If ApplicationStatusLabel.Text <> CurrentStatusText Then
                        Changed = True
                        ApplicationStatusLabel.Text = CurrentStatusText
                    End If
                End If

                If Not ApplicationToolStripLabel Is Nothing Then
                    If ApplicationToolStripLabel.Text <> CurrentStatusText Then
                        Changed = True
                        ApplicationToolStripLabel.Text = CurrentStatusText
                    End If
                End If
            End If

            If Not ApplicationProgressBar Is Nothing Then
                If ApplicationProgressBar.Value <> CurrentProgress Then
                    Changed = True
                    ApplicationProgressBar.Value = CurrentProgress
                End If
            End If
        End With

        If Changed Then
            ApplicationForm.Refresh()
        End If

        Application.DoEvents()
    End If
End Sub

现在,我可以通过在程序的主要入口点内的类中抛出Caused by: java.lang.IllegalStateException: The path to the driver executable must be set by the webdriver.chrome.driver system property; for more information, see https://github.com/SeleniumHQ/selenium/wiki/ChromeDriver. The latest version can be downloaded from http://chromedriver.storage.googleapis.com/index.html 来避免该错误,但是不确定如何使用单元测试解决该问题。

我的基本测试:

System.setProperty("webdriver.chrome.driver", "/path/to/myexecutable.exe")

还有我的三个简单的类-浏览器,主页和页面:

浏览器

package com.mytestpackage;

import org.junit.Assert;
import org.junit.Test;

public class UnitTest {

    @Test
    public void canGoToHomePage() {
        Pages.homePage().goTo();
        Assert.assertTrue(Pages.homePage().isAt());
    }
}

主页

package com.mytestpackage;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class Browser {

    static WebDriver driver = new ChromeDriver();

    public static void goTo(String url) {
        driver.get(url);
    }

    public static String title() {
        return driver.getTitle();
    }
}

页面

package com.mytestpackage;

public class HomePage {

    static String url = "http://test.salesforce.com";
    static String title = "Login | Salesforce";

    public void goTo() {
        Browser.goTo(url);
    }

    public boolean isAt() {
        return Browser.title().equals(title);
    }
}

无奈的要点是无法编辑系统变量。任何破解/解决方法建议将不胜感激。

1 个答案:

答案 0 :(得分:3)

看来您看到的问题已由WebDriverManager解决-official docs

我们在框架中使用它,它使所有用户都无需承担系统属性和chromedriver版本。 (当您使用chromedriver的可执行文件时,您需要确保也随浏览器更新一起对其进行更新)

在测试类中添加以下方法:

@BeforeClass
public static void setupClass() {
    WebDriverManager.chromedriver().setup();
}

不要忘记在pom.xml中将依赖项附加到WebDriverManager(需要Java 8或更高版本):

<dependency>
    <groupId>io.github.bonigarcia</groupId>
    <artifactId>webdrivermanager</artifactId>
    <version>3.0.0</version>
    <scope>test</scope>
</dependency>

...或在Gradle项目中:

dependencies {
    testCompile("io.github.bonigarcia:webdrivermanager:3.0.0")
}

重要的旁注::从Browser类中的WebDriver字段声明中删除“静态”。保持静态将不允许您继续执行并行测试。