我正在使用Cucumber for Java和Selenium构建一个测试套件。我的项目结构非常像这样:
现在,我所做的是在src / test / java中添加一个Hooks.java类,并使用@Before钩子设置驱动程序路径:
@Before
public void setUpDriver(){
System.setProperty("webdriver.chrome.driver", "src\\test\\resources\\seleniumdrivers\\chromedriver.exe");
}
但是,由于此方法将在每个场景之前运行,我想找到一种更好的方法来设置路径,因此它只执行一次。请注意,我想在我的项目结构中使用驱动程序并使用系统属性设置它(我的意思是,我不想将驱动程序放在我的文件系统中的某处并将其添加到PATH环境变量中)。
有一个更好的方法吗?
您可以创建一个属性文件,如config.properties
,以存储您在整个执行过程中使用的所有全局值以及chromedriver.exe
的路径,并在所有场景之前读取它并在整个执行过程中使用,如下所示。
public class Hooks {
private static boolean beforeSuit = true;
private static String executablePath;
static Properties prop;
@Before
public void beforeAll() {
if(beforeSuit) {
prop = new Properties();
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream stream = loader.getResourceAsStream("/config.properties");
prop.load(stream);
//You can use this anywhere you want to launch the chrome.
executablePath = prop.getProperty("executablePath");
//To make it execute only once
beforeSuit = false;
//If you wish to launch browser only once , you can have that code here.
}
//Here you can keep code to be execute before each scenario
}
}
您可以将驱动程序保留在项目文件夹中,并使用System.getProperty
获取该项目路径
您可以尝试以下代码: -
String path= System.getProperty("user.dir");
System.setProperty("webdriver.chrome.driver", path+"\\src\\test\\resources\\test\\chromedriver.exe");
由于您不想将其添加到PATH环境变量,您可以将chromedriver二进制文件放在文件系统中的任何位置(包括src\\test\\resources\\seleniumdrivers\\
),并且仍然可以在System.setProperty()
中指定如下:
@Before
public void setUpDriver(){
System.setProperty("webdriver.chrome.driver", ".\\src\\test\\resources\\seleniumdrivers\\chromedriver.exe");
}
如果你使用Maven在你的pom.xml中添加这两个依赖项,你会没事的,现在你可以删除System.setProperty行。使用这种技术,该项目的硬编码方法较少。
<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>3.3.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.6.2</version>
<scope>test</scope>
</dependency>
您还需要添加此行以进行设置
WebDriverManager.chromedriver().setup();