有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Cucumber(Java)和Selenium:使用setProperty在何处放置驱动程序路径?

我正在使用Cucumber for Java和Selenium构建一个测试套件。我的项目结构大致如下:

  • src/test/java:这是我实现测试步骤的地方
  • src/test/resources/features:这里有功能文件
  • src/test/resources/seleniumdrivers:这就是我放置chromedriver的地方。exe

现在,我做的是添加一个钩子。src/test/java中的java类,使用@Before钩子设置驱动程序路径的方法:

@Before
public void setUpDriver(){
    System.setProperty("webdriver.chrome.driver", "src\\test\\resources\\seleniumdrivers\\chromedriver.exe");
}

但是,由于此方法将在每个场景之前运行,因此我想找到一种更好的方法来设置路径,因此它只执行一次。请注意,我希望将驱动程序放在我的项目结构中,并使用系统属性进行设置(我的意思是,我不希望将驱动程序放在文件系统中的某个位置,并将其添加到PATH环境变量中)

有更好的方法吗


共 (4) 个答案

  1. # 1 楼答案

    如果使用Maven,请在pom中添加这两个依赖项。xml,你会没事的,现在你可以删除系统了。设置建筑红线。有了这种技术,项目的硬编码方法就少了

     <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();
    
  2. # 2 楼答案

    由于不想将其添加到PATH环境变量中,您可以将chromedriver二进制文件放置在文件系统中的任何位置(包括src\\test\\resources\\seleniumdrivers\\),并且仍然可以在System.setProperty()中指定如下:

    @Before
    public void setUpDriver(){
        System.setProperty("webdriver.chrome.driver", ".\\src\\test\\resources\\seleniumdrivers\\chromedriver.exe");
    }
    
  3. # 3 楼答案

    您可以将驱动程序保存在项目文件夹中,并使用System.getProperty获取该项目路径

    您可以尝试以下代码:-

     String path= System.getProperty("user.dir");
    
      System.setProperty("webdriver.chrome.driver", path+"\\src\\test\\resources\\test\\chromedriver.exe");
    
  4. # 4 楼答案

    您可以创建一个属性文件,如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
    
        }
    }