【问题标题】:Cucumber (Java) and Selenium: where to place driver path using setProperty?Cucumber (Java) 和 Selenium:使用 setProperty 在哪里放置驱动程序路径?
【发布时间】:2018-07-28 22:12:58
【问题描述】:

我正在使用 Cucumber for Java 和 Selenium 构建一个测试套件。而我的项目结构差不多是这样的:

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

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

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

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

有没有更好的方法来做到这一点?

【问题讨论】:

  • 你可以在 hooks 类中使用静态标志来运行一次,也可以在 runner 类中使用 BeforeClass(对于 junit5 为 BeforeAll)。参考这个——automationpanda.com/2017/03/03/…
  • 你想在所有场景之前设置驱动路径还是只启动一次浏览器(即在第一个场景之前)
  • @Grasshopper 问题是,@BeforeAll 不适用于 Cucumber 的 Java 实现 (stackoverflow.com/questions/19770103/…)。但是静态标志听起来是个好主意,谢谢!
  • 看看我的回答。它可能会解决您的问题。
  • @Floella 我说的是junit junit.org/junit5/docs/current/user-guide/… 的BeforeAll 注释,而不是黄瓜红宝石。这将进入黄瓜跑步者课程。

标签: java selenium cucumber cucumber-jvm


【解决方案1】:

您可以创建一个像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

    }
}

【讨论】:

  • 好的,谢谢。我实际上比您提出的答案要短一些,但它遵循相同的想法。我在我的类中添加了一个布尔属性,然后在 @before 方法中:if(beforeSuit) { System.setProperty("webdriver.chrome.driver", "src\\test\\resources\\seleniumdrivers\\chromedriver.exe"); beforeSuit = false; }
【解决方案2】:

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

你可以试试下面的代码:-

 String path= System.getProperty("user.dir");

  System.setProperty("webdriver.chrome.driver", path+"\\src\\test\\resources\\test\\chromedriver.exe");

【讨论】:

  • 对,但我应该把这个放在哪里?因为我做了一些与你的建议非常相似的事情,但我对它在 @Before 钩子中并不满意。我的意思是,它有效,但它看起来不是一个好习惯。我正在尝试以最好的方式实现它。
【解决方案3】:

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

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

【讨论】:

  • 对,但这正是我所做的。我的问题是:这个@Before 钩子将在每次测试之前运行,这并不理想。我只想在整个套件运行之前设置一次驱动程序路径。
  • 你为什么觉得is not ideal?由于@Before 挂钩将在每次测试之前运行,因此您可以灵活地在 ChromeDriverGeckoDriverIEDriverServer 之间进行选择i> 以及保存在不同子目录中的不同版本。
  • 是的,但这是设置驱动程序路径,而不是打开浏览器。然后我会添加另一个钩子来打开我需要的任何浏览器,但这是一个不同的问题。我觉得我只需要告诉我的套房“你会在这里找到司机”一次。
【解决方案4】:

如果你使用 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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-10
    • 1970-01-01
    • 2022-08-17
    • 2018-11-30
    • 2018-07-12
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    相关资源
    最近更新 更多