当前位置: 首页 > 知识库问答 >
问题:

如果在@Before中初始化驱动程序,在哪里存储钩子

穆博简
2023-03-14

我会试着解释我是如何构建这个的,我想一些显而易见的东西可能会跳出来。

我对此相对较新,但正在构建一个Cucumber-appium框架,并且遇到了一些麻烦。目前,我在我的“前钩子”中初始化我的Appium驱动程序,该钩子位于包含所有钩子的GlobalHooks类中。我已经更改了钩子,因此它的一部分仅在测试运行开始时运行,因为Cucumber不支持全局钩子,我不明白为什么我应该在每次测试前初始化驱动程序(我使用的是Junit,因此无法利用TestNG的“前钩子”功能)。

为了利用Appium的并行会话,我现在想让我的驱动程序(在GlobalHooks类中声明并在该类的@在之前方法中定义)是非静态的,并且它在整个套件中呈现问题。

如果我想让我的页面类使用这个驱动程序,在这样的钩子中定义我的驱动程序是明智的吗?或者有没有人对如何初始化非静态驱动程序有什么建议,以便它们可以用于运行并行Appium会话?

这可能更像是一个Java问题,而不是cucumber或苹果。

共有2个答案

阎安邦
2023-03-14

@蚱蜢。回到你身边是因为我说过当我有适合我的装备时我会的。再次感谢您的投入,非常宝贵。我像你建议的那样设置了一个SharedDriver类,但改变了一两件事,以考虑到我将在不同的连接设备上运行每个线程,这意味着每次运行一个单独的AppiumDriver,而不是一个新的WebDriver。

我通过输入我的BeforeClass方法解决了这个问题,该方法用于创建我连接的所有设备的池的类。然后,我的 SharedDriver 使用 AtomicIntecger 循环访问它们以保持线程安全,并将相关驱动程序添加到工厂

我也喜欢在第一个连接的设备上从IDE运行测试以进行调试和快速测试的想法。由于 BeforeClass 在 IDE 中运行时不会运行,因此我的 SharedDriver 类会检查此情况,如果它尚未运行,则它会为第一个连接的设备添加一个 AppiumDriver,并改为在其上运行测试。

很抱歉耽误了回来,从那以后我一直在做其他项目。再次感谢你的帮助

姜淇
2023-03-14

这是并行使用selenium驱动程序的精简版本。它应该类似于应用程序驱动程序。这使用pico-container在场景中创建和共享对象。需要添加cucumber-picocontainer依赖项。

DriverFactory将所有驱动程序存储在ThreadLocal变量drivers中。

public final class DriverFactory {

    private static ThreadLocal<WebDriver> drivers = new ThreadLocal<>();
    //To quit the drivers and browsers at the end only. 
    private static List<WebDriver> storedDrivers = new ArrayList<>();

    static {
        Runtime.getRuntime().addShutdownHook(new Thread(){
            public void run(){
                storedDrivers.stream().forEach(WebDriver::quit);
            }
          });
    }

    private DriverFactory() {}

    public static WebDriver getDriver() {
        return drivers.get();
    }

    public static void addDriver(WebDriver driver) {
        storedDrivers.add(driver);
        drivers.set(driver);
    }

    public static void removeDriver() {
        storedDrivers.remove(drivers.get());
        drivers.remove();
    }   
}

仅用于允许pico容器创建所需的驱动程序。检查驱动程序是否已存在以供线程重用。为了避免这种情况,您可以考虑扩展<code>ThreadLocal方法。

public class SharedDriver {
    public SharedDriver() {
        if (DriverFactory.getDriver() == null) {
        System.setProperty("webdriver.chrome.driver", "path/to/chromedriver.exe");
        DriverFactory.addDriver(new ChromeDriver());
    }
    }   
}
public class GoogleHomePO extends LoadableComponent<GoogleHomePO>{

    @FindBy(name="q")
    private WebElement searchTextBox;

    public GoogleHomePO() {
        DriverFactory.getDriver().get("https://www.google.com/");
        PageFactory.initElements(DriverFactory.getDriver(), this);
    }

    public void enterSearch(String search) {
        searchTextBox.sendKeys(search);
    }
}

SharedDriver类需要添加到项目中的任何一步定义构造函数中。由于cucumber初始化了每个场景的所有步骤和挂钩类,因此pico容器将在需要时实例化驱动程序对象并将其存储在DriverFactory中。

public class StepDefinition {

    private GoogleHomePO gmPO;

    public StepDefinition(SharedDriver driver, GoogleHomePO gmPO) {
        this.gmPO = gmPO;
    }

    @Given("Go to google page")
    public void given() {
        gmPO.get();
    }

    @When("Enter search {string}")
    public void when(String search) {
        gmPO.enterSearch(search);
    }    
}

功能文件1

Feature: 

  Scenario: First
    Given Go to google page
    When Enter search "From Feature One"

  Scenario: First Again
    Given Go to google page
    When Enter search "From Feature One Again Again"

特征文件2

Feature:

  Scenario: Second
    Given Go to google page
    When Enter search "From Feature Two"

POM设置

<plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>3.0.0-M3</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>integration-test</goal>
                        </goals>
                        <configuration>
                            <includes>
                                <include>**/*Runner.java</include>
                            </includes>

                            <parallel>methods</parallel>
                            <useUnlimitedThreads>true</useUnlimitedThreads>

                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
 类似资料:
  • 初始化 Lotus 驱动程序 当安装 Lotus 数据库的驱动程序时,设置程序会在引擎的 Windows 注册表和 ISAM 格式子键写入一些缺省值。不要直接修改这些设置;请使用应用程序的设置程序来添加、删除、或更改这些设置。下面部分描述 Lotus 数据库驱动程序的初始化和 ISAM Format 设置。 Lotus 初始化设置 Jet\3.5\Engines\Lotus 文件夹包含用来访问外部

  • 初始化 Microsoft Excel 驱动程序 当安装 Microsoft Excel 数据库的驱动程序时,设置程序会在引擎的 Windows 注册表和 ISAM 格式子键写入一些缺省值。不要直接修改这些设置;请使用应用程序的设置程序来添加、删除、或更改这些设置。下列部分描述 Microsoft Excel 数据库驱动程序的初始化和 ISAM Formats 设置。 Microsoft Exce

  • 包实用程序 基类 登录类 App_Constant类 包添加用户 null 现在我的问题是,我已经在基类中创建了公共静态方法openurl(),并且webdriver已经在那里初始化。但是当我在同一个包的其他类和其他包中调用同一个方法时,为什么它会给我WebDriver的nullpointerexception? 是否需要编写代码来初始化webdriver并在每个类中调用browser。如何才能全

  • 初始化Text和HTML Data Source 驱动程序 Text Data源和HTML数据源使用同一个数据库驱动程序。 当安装 Text Data Source 数据库驱动程序时,设置程序会在引擎的 Windows 注册表和 ISAM Formats子键中写入一些缺省值。不要直接修改这些设置;请使用应用程序的设置程序来添加、删除、或更改这些设置。下列部分描述 Text Data Source

  • 初始化 Microsoft Exchange Data Source 驱动程序 当安装 Microsoft Exchange Data Source 数据库的驱动程序时,设置程序会在引擎的 Windows 注册表和 ISAM Formats子键中写入一些缺省值。不要直接修改这些设置;请使用应用程序的设置程序来添加、删除、或更改这些设置。下列部分描述 Microsoft Exchange Data

  • 初始化 Paradox 数据库的驱动程序 当安装 Paradox 数据库的驱动程序时,设置程序会在引擎的 Windows 注册表和 ISAM Formats子键写入一些缺省值。不应直接修改这些设置(除非必要);而应使用应用程序的设置程序来添加、删除、或更改这些设置。下列部分描述 Paradox 数据库驱动程序的初始化和 ISAM Formats 设置。 Paradox 数据库驱动程序在两种模式中的