簡體   English   中英

測試前在 Cucumber-JVM 中初始化 WebDriver 作為依賴注入

[英]Initialise WebDriver as dependency injection in Cucumber-JVM before test

我是 Cucumber-JVM 的新手,之前我曾經創建一個 BaseTest class,在某些 @BeforeMethod 中初始化 WebDriver,然后從 BaseTest class 擴展所有其他測試類,因此 WebDriver 初始化在代碼庫和 WebDriver 初始化中一次性管理應該在每次測試之前發生。 使用 Cucumber-JVM,我知道這個想法是在一些 class 中初始化 WebDriver,用 @ScenarioScoped 注釋標記這個 class,然后在帶有 @Inject 注釋的 StepDefinitions 中使用這個 class 的實例——這樣我就可以訪問創建的 WebDriver。 我嘗試了不同的選擇,但沒有成功。 我按照這些指南中的步驟操作,但每次我都會遇到類似的錯誤: http://www.thinkcode.se/blog/2017/08/16/sharing-state-between-steps-in-cucumberjvm-using-guice https: //codoid.com/automation-testing/an-all-inclusive-guide-to-achieve-cucumber-dependency-injection-using-guice/

我在下面附上我的文件和當前的 state,希望有人能指導我正確的方法。

[ERROR] Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 1.813 s <<< FAILURE! - in TestSuite
[ERROR] wiki.runners.MainPageRunnerTest.runScenario["Open main page from home page in English locale", "Optional[Open main page]"](1)  Time elapsed: 0.643 s  <<< FAILURE!
com.google.inject.ProvisionException: 
Unable to provision, see the following errors:

1) [Guice/ErrorInjectingConstructor]: NoSuchMethodError: 'ImmutableMap ImmutableMap.of(Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object)'
  at wiki.World.<init>(World.java:10)
  at wiki.World.class(World.java:10)
  at OpenMainPageDefinitions.world(OpenMainPageDefinitions.java:15)
      \_ for field world
  while locating OpenMainPageDefinitions

Learn more:
  https://github.com/google/guice/wiki/ERROR_INJECTING_CONSTRUCTOR

1 error

======================
Full classname legend:
======================
ImmutableMap:            "com.google.common.collect.ImmutableMap"
OpenMainPageDefinitions: "wiki.definitions.OpenMainPageDefinitions"
========================
End of classname legend:
========================

        at com.google.inject.internal.InternalProvisionException.toProvisionException(InternalProvisionException.java:251)
        at com.google.inject.internal.InjectorImpl$1.get(InjectorImpl.java:1104)
        at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1139)
        at io.cucumber.guice.GuiceFactory.getInstance(GuiceFactory.java:83)
        at io.cucumber.java.AbstractGlueDefinition.invokeMethod(AbstractGlueDefinition.java:47)
        at io.cucumber.java.JavaStepDefinition.execute(JavaStepDefinition.java:29)
        at io.cucumber.core.runner.CoreStepDefinition.execute(CoreStepDefinition.java:66)
        at io.cucumber.core.runner.PickleStepDefinitionMatch.runStep(PickleStepDefinitionMatch.java:63)
        at io.cucumber.core.runner.ExecutionMode$1.execute(ExecutionMode.java:10)
        at io.cucumber.core.runner.TestStep.executeStep(TestStep.java:86)
        at io.cucumber.core.runner.TestStep.run(TestStep.java:57)
        at io.cucumber.core.runner.PickleStepTestStep.run(PickleStepTestStep.java:51)
        at io.cucumber.core.runner.TestCase.run(TestCase.java:95)
        at io.cucumber.core.runner.Runner.runPickle(Runner.java:75)
        at io.cucumber.testng.TestNGCucumberRunner.lambda$runScenario$1(TestNGCucumberRunner.java:132)
        at io.cucumber.core.runtime.CucumberExecutionContext.lambda$runTestCase$3(CucumberExecutionContext.java:151)
        at io.cucumber.core.runtime.RethrowingThrowableCollector.executeAndThrow(RethrowingThrowableCollector.java:23)
        at io.cucumber.core.runtime.CucumberExecutionContext.runTestCase(CucumberExecutionContext.java:151)
        at io.cucumber.testng.TestNGCucumberRunner.runScenario(TestNGCucumberRunner.java:129)
        at io.cucumber.testng.AbstractTestNGCucumberTests.runScenario(AbstractTestNGCucumberTests.java:35)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:568)
        at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
        at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
        at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
        at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
        at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
        at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
        at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
        at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
        at org.testng.TestRunner.privateRun(TestRunner.java:808)
        at org.testng.TestRunner.run(TestRunner.java:603)
        at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
        at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
        at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
        at org.testng.SuiteRunner.run(SuiteRunner.java:326)
        at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
        at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
        at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
        at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
        at org.testng.TestNG.runSuites(TestNG.java:1092)
        at org.testng.TestNG.run(TestNG.java:1060)
        at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:324)
        at org.apache.maven.surefire.testng.TestNGXmlTestSuite.execute(TestNGXmlTestSuite.java:74)
        at org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:123)
        at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:456)
        at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:169)
        at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:595)
        at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:581)
Caused by: java.lang.NoSuchMethodError: 'com.google.common.collect.ImmutableMap com.google.common.collect.ImmutableMap.of(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object)'
        at org.openqa.selenium.chrome.AddHasCasting.getAdditionalCommands(AddHasCasting.java:38)
        at org.openqa.selenium.chrome.ChromeDriver$ChromeDriverCommandExecutor.getExtraCommands(ChromeDriver.java:123)
        at org.openqa.selenium.chrome.ChromeDriver$ChromeDriverCommandExecutor.<init>(ChromeDriver.java:118)
        at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:106)
        at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:93)
        at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:82)
        at wiki.WebDriverManager.<init>(WebDriverManager.java:16)
        at wiki.World.<init>(World.java:11)
        at wiki.World$$FastClassByGuice$$11467.GUICE$TRAMPOLINE(<generated>)
        at wiki.World$$FastClassByGuice$$11467.apply(<generated>)
        at com.google.inject.internal.DefaultConstructionProxyFactory$FastClassProxy.newInstance(DefaultConstructionProxyFactory.java:82)
        at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:114)
        at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:91)
        at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:300)
        at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
        at io.cucumber.guice.SequentialScenarioScope.lambda$scope$0(SequentialScenarioScope.java:40)
        at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:45)
        at com.google.inject.internal.SingleFieldInjector.inject(SingleFieldInjector.java:50)
        at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:146)
        at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:124)
        at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:91)
        at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:300)
        at com.google.inject.internal.InjectorImpl$1.get(InjectorImpl.java:1101)
        ... 50 more

[INFO] 
[INFO] Results:
[INFO] 
[ERROR] Failures: 
[ERROR]   MainPageRunnerTest>AbstractTestNGCucumberTests.runScenario:35 » Provision Unable to provision, see the following errors:

1) [Guice/ErrorInjectingConstructor]: NoSuchMethodError: 'ImmutableMap ImmutableMap.of(Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object)'
  at wiki.World.<init>(World.java:10)
  at wiki.World.class(World.java:10)
  at OpenMainPageDefinitions.world(OpenMainPageDefinitions.java:15)
      \_ for field world
  while locating OpenMainPageDefinitions

Learn more:
  https://github.com/google/guice/wiki/ERROR_INJECTING_CONSTRUCTOR

1 error

======================
Full classname legend:
======================
ImmutableMap:            "com.google.common.collect.ImmutableMap"
OpenMainPageDefinitions: "wiki.definitions.OpenMainPageDefinitions"
========================
End of classname legend:
========================

[INFO] 
[ERROR] Tests run: 1, Failures: 1, Errors: 0, Skipped: 0

OpenMainPageDefinitions.java:

package wiki.definitions;

import com.google.inject.Inject;
import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then;
import io.cucumber.java.en.When;
import wiki.World;
import wiki.pages.EnMainPage;
import wiki.pages.HomePage;

public class OpenMainPageDefinitions {

    @Inject World world;
    public HomePage homePage;
    public EnMainPage enMainPage;

    @Given("Home page is opened")
    public void homePageIsOpened() {
        homePage = new HomePage(world.manager.get());
        homePage.open().assertCentralFeaturedLogoIsDisplayed();
    }

    @When("User clicks on Main Page Link")
    public void userClicksOnMainPageLink() {
        homePage.clickEnMainPageLink();
        enMainPage = new EnMainPage(world.manager.get());
    }

    @Then("Welcome block is displayed")
    public void welcomeBlockIsDisplayed() {
        enMainPage.assertWelcomeBlockIsDisplayed();
    }

}

世界.java

package wiki;

import io.cucumber.guice.ScenarioScoped;

@ScenarioScoped
public class World {

    public WebDriverManager manager;

    public World() {
        manager = new WebDriverManager();
    }

}

WebDriverManager.java

package wiki;

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

public class WebDriverManager {

    public String env;
    public ChromeOptions options;
    public WebDriver driver;

    public WebDriverManager() {
        env = getEnv();
        options = getChromeOptions();
        driver = new ChromeDriver(options);
    }

    public ChromeOptions getChromeOptions() {
        if(env.equals("CIRCLE_CI")) {
            return new ChromeOptions()
                    .addArguments("--disable-dev-shm-usage")
                    .addArguments("--headless")
                    .addArguments("--no-sandbox");
        }
        return new ChromeOptions();
    }

    public String getEnv() {
        String env = System.getenv("WIKI_ENV");
        return env == null ? "LOCAL" : env;
    }

    public WebDriver get() {
        return driver;
    }

}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>cucumber-selenium-tests</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <maven-surefire-plugin.version>3.0.0-M6</maven-surefire-plugin.version>
        <maven-compiler-plugin.version>3.10.1</maven-compiler-plugin.version>
        <testng.version>7.5</testng.version>
        <selenium-java.version>4.1.3</selenium-java.version>
        <cucumber.version>7.2.3</cucumber.version>
        <google-inject.version>5.1.0</google-inject.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven-compiler-plugin.version}</version>
        </dependency>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>${testng.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>${testng.version}</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>${selenium-java.version}</version>
        </dependency>
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-testng</artifactId>
            <version>${cucumber.version}</version>
        </dependency>
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-java</artifactId>
            <version>${cucumber.version}</version>
        </dependency>
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-guice</artifactId>
            <version>${cucumber.version}</version>
        </dependency>
        <dependency>
            <groupId>com.google.inject</groupId>
            <artifactId>guice</artifactId>
            <version>${google-inject.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>${maven-surefire-plugin.version}</version>
                <configuration>
                    <systemPropertyVariables>
                        <webdriver.chrome.driver>/tmp/chromedriver/chromedriver</webdriver.chrome.driver>
                    </systemPropertyVariables>
                    <suiteXmlFiles>
                        <suiteXmlFile>testng.xml</suiteXmlFile>
                    </suiteXmlFiles>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

如果您在項目根目錄中運行mvn dependency:tree -Dverbose ,您將能夠分析項目的依賴層次結構。

Package com.google.common.collect.ImmutableMap分布在guava庫中。 依賴分析顯示 Selenium 使用版本31.1而 Guice 使用版本30.1

Guice 下的 Guava 更靠近樹根,因此它被 Maven 占用,考慮到 lib 越靠近根,它在發生沖突時的優先級越高。

有以下三種解決方案:

  1. 將 Selenium 的版本降低到使用低版本 Guava 的版本(最好是 30.1,但大版本匹配也是可以接受的)
  2. 將 Guice 版本增加到使用更高版本 Guava 的版本(最好是 31.1,但也可以接受主要版本匹配)
  3. 隱式指定 guava 依賴項。 將 31.1 版本依賴項添加到您的pom.xml 它將絕對優先於其他人。 並希望它向后兼容 30.1,這樣 Guice 邏輯就不會受到影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM