Как мне закрыть () и выйти () драйвер Selenium, не затрагивая другие шаги в Cucumber и Selenium? - PullRequest
3 голосов
/ 17 апреля 2019

У меня есть два файла функций в Cucumber, которые связаны с соответствующими файлами шагов. Проблема заключается в том, что когда один из файлов шага завершает выполнение, он закрывает все окна браузера (из-за driver.quit()), в результате чего завершается выполнение другого файла шага, который еще не выполнил обработку.

Здесь каждый файл шага открывает новое окно браузера, выполняет в нем тесты, а затем закрывает и закрывает браузер. В настоящее время у меня есть только два файла шагов, но в будущем их будет намного больше.

Есть ли в Cucumber что-нибудь, что всегда выполнялось бы после выполнения всех шагов?

Как мне решить эту проблему?

HelpStep.java

@Ignore
public class HelpStep {

    private WebDriver driver;

    @Before
    public void setup() {
        System.out.println("Into the setup method of HelpStep...");
        this.driver = BrowserConfig.getIEWebDriver();
    }

    @Given("^The user is on the Help page$")
    public void onPage() {
        System.out.println("The user is on the Help page");
    }

    @When("^The user clicks on the links within the Help page$")
    public void clickLinks() {
        System.out.println("The user clicks on the links within the Help page");
    }

    @Then("^The user is navigated to that section$")
    public void validate() {
        System.out.println("The user is navigated to that section");
    }

    @After
    public void cleanUp() {
        System.out.println("Into the cleanUp method of HelpStep...");
        //FOLLOWING METHOD CALL KILLS ALL THE OPEN BROWSERS ALSO :(
        BrowserConfig.releaseResources(this.driver);
    }

}

LinkStatsStep.java

@Ignore
public class LinkStatsStep {

    private WebDriver driver;

    @Before
    public void setup() {
        System.out.println("Into the setup method of LinkStatsStep...");
        this.driver = BrowserConfig.getIEWebDriver();
    }

    @Given("^The user is on the Link Statistics page$")
    public void onPage() {
        System.out.println("The user is on the Link Statistics page");
    }

    @When("^The user does a search$")
    public void clickLinks() {
        System.out.println("The user does a search");
    }

    @Then("^The user is displayed search result$")
    public void validate() {
        System.out.println("The user is displayed search result");
    }

    @After
    public void cleanUp() {
        System.out.println("Into the cleanUp method of LinkStatsStep...");
        BrowserConfig.releaseResources(this.driver);
    }

}

TestRunner.java

@RunWith(Cucumber.class)
@CucumberOptions(
        plugin = {"pretty", "json:target/cucumber-reports/cucumber.json"},
        features = {"src/test/resources/features"})
public class TestRunner extends ApplicationTests {

}

BrowserConfig.java

public class BrowserConfig {

    private static final String IE_DRIVER_EXE = "drivers/IEDriverServer.exe";
    private static final String WEBDRIVER_IE_DRIVER = "webdriver.ie.driver";
    private static final String BASE_URL = "https://www.google.com";

    public static WebDriver getIEWebDriver() {
        String filePath = ClassLoader.getSystemClassLoader().getResource(IE_DRIVER_EXE).getFile();
        System.setProperty(WEBDRIVER_IE_DRIVER, filePath);
        InternetExplorerOptions options = new InternetExplorerOptions().requireWindowFocus();
        options.setCapability(INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true);
        options.setCapability(ENABLE_ELEMENT_CACHE_CLEANUP, true);
        options.setCapability(IE_ENSURE_CLEAN_SESSION, true);
        options.setCapability(ACCEPT_SSL_CERTS, true);
        options.setCapability("nativeEvents", false);
        options.setCapability(INITIAL_BROWSER_URL, BASE_URL);
        System.out.println("Initializing IE Driver now...........");
        WebDriver driver = new InternetExplorerDriver(options);
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
        return driver;
    }

    public static void releaseResources(WebDriver driver) {
        System.out.println("Releasing resources now.....");
        if (null != driver) {
            driver.close();
            driver.quit(); //CLOSES ALL THE OPEN BROWSER SESSIONS LEAVING OTHER STEP EXECUTIONS INCOMPLETE
        }
    }

}

help.feature

Feature: Check that the user is able to navigate to Help page

  Scenario:
    Given The user is on the Help page
    When The user clicks on the links within the Help page
    Then The user is navigated to that section

канальный stats.feature

Feature: Check that the user is able to navigate to Link Statistics page

  Scenario:
    Given The user is on the Link Statistics page
    When The user does a search
    Then The user is displayed search result

System.outs

Initializing IE Driver now...........
Listening on port 47613
Into the setup method of LinkStatsStep...
Initializing IE Driver now...........
Listening on port 5009
The user is on the Help page
The user clicks on the links within the Help page
The user is navigated to that section
Into the cleanUp method of HelpStep...
Releasing resources now.....
Into the cleanUp method of LinkStatsStep...
Releasing resources now.....


Into the setup method of HelpStep...
Initializing IE Driver now...........
Listening on port 17291
Into the setup method of LinkStatsStep...
Initializing IE Driver now...........
Listening on port 23793
The user is on the Link Statistics page
The user does a search
The user is displayed search result
Into the cleanUp method of HelpStep...
Releasing resources now.....
Into the cleanUp method of LinkStatsStep...
Releasing resources now.....

Ответы [ 3 ]

1 голос
/ 18 апреля 2019

Глядя на ваш код, он будет выглядеть правильно.

Вызов quit должен закрыть все открытые окна, связанные с этим сеансом веб-драйвера. Он не должен закрывать окна других сеансов вебдрайвера. Поэтому я думаю, что вы столкнулись с проблемой в IEDriverServer.

Если это так, и если вы выполняете свои тесты в JVM, которая завершает работу после выполнения всех тестов. Затем, в качестве обходного пути, вы можете использовать завершающие хуки для вызова quite и закрытия всех сеансов веб-драйвера. Например:

private static final Thread CLOSE_THREAD = new Thread() {
    @Override
    public void run() {
      // Start a new webdriver to call quit on
      // For IE this will terminate all webdriver sessions
      getIEWebDriver().quit();
    }
};

static {
    Runtime.getRuntime().addShutdownHook(CLOSE_THREAD);
}
0 голосов
/ 24 апреля 2019

Разместил ответ здесь, так как этот вопрос более или менее похож на предыдущий.https://stackoverflow.com/a/55836832/2325154

0 голосов
/ 17 апреля 2019

Это потому, что управление драйвером не выполнено должным образом.Я бы предложил использовать qaf, который управляет драйверами и ресурсами.С QAF ваш файл шага будет выглядеть следующим образом:

public class HelpStep {
    //setup or tear-down not required here...

    @Given("^The user is on the Help page$")
    public void onPage() {
       //you can access driver any where like below:
       //WebDriver driver = new WebDriverTestBase().getDriver();
        System.out.println("The user is on the Help page");
    }

    @When("^The user clicks on the links within the Help page$")
    public void clickLinks() {
        System.out.println("The user clicks on the links within the Help page");
    }

    @Then("^The user is navigated to that section$")
    public void validate() {
        System.out.println("The user is navigated to that section");
    }
}

Для доступа к объекту драйвера в любом месте кода вы можете получить его из тестовой базы.

WebDriver driver = new WebDriverTestBase().getDriver();

Ниже приведены примеры взаимодействияс элементом в любом месте кода:

  • Использование findBy
    • driver.findElement("name=q").click();
  • Использование фабрики элементов
      import static com.qmetry.qaf.automation.ui.webdriver.ElementFactory.$;
      ...
      $("name=q").click();
  • Использование встроенной библиотеки шагов
      import static com.qmetry.qaf.automation.step.CommonStep.*;
      ...
      click("name=q");

в приведенном выше примере name=q - это локатор элемента с использованием name в качестве стратегии локатора, которая будет автоматически преобразованана By.name.

LinkStatsStep

import static com.qmetry.qaf.automation.step.CommonStep.*;
...

public class LinkStatsStep {


    @Given("^The user is on the Link Statistics page$")
    public void onPage() {
        get("/");
    }

    @When("^The user does a search$")
    public void clickLinks() {
        System.out.println("The user does a search");
        click("elementlocator");
        //$("elementlocator").click();
    }

    @Then("^The user is displayed search result$")
    public void validate() {
        verifyLinkWithPartialTextPresent("link text");
        //$("partialLink=link text").verifyPresent();
    }

}

Ваш файл огурца останется таким же.Чтобы запустить свой файл gherkin , используйте GherkinScenarioFactory

Вы можете указать браузер для использования, используя driver.name свойство .Вам не нужно писать код для создания или сноса драйвера.Вы можете установить поведение сеанса драйвера, используя свойство selenium.singletone.

#this will tear down driver after each testcase/scenario
selenium.singletone=method
#this will tear down driver after each xml test node in configuration file
selenium.singletone=test
#this will tear down driver after each xml test node in configuration file and will reuse same driver session for testcases/scenario configured under same xml test node.
selenium.singletone=test
#this will tear down driver after each xml suite node in configuration file.
selenium.singletone=suite
...