Почему TestNG Selenium параллельно по методу не работает? - PullRequest
0 голосов
/ 23 апреля 2019

У меня около 13 тестовых классов, и этот параметр отлично выполняет параллельные классы:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Office Suite" thread-count="5" parallel="classes">
    <test name="Office Test" allow-return-values="true">
        <packages>
            <package name="testSuite.*"/>
        </packages>
    </test>
</suite>

Однако, когда я пытаюсь запустить на уровне метода, у меня возникают проблемы:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Office Suite" thread-count="5" parallel="methods">
    <test name="Office Test" allow-return-values="true">
        <packages>
            <package name="testSuite.*"/>
        </packages>
    </test>
</suite>

Я начинаю видеть org.openqa.selenium.NoSuchElementException: Timed out after 5 seconds. Unable to locate the element.

Также этот параметр не работает:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Office Suite" thread-count="5" parallel="methods">
    <test name="Office Test" allow-return-values="true">
        <classes>
            <class name="testSuite.CustomerProfileBillingTest"/>
            <class name="testSuite.CustomerProfileTest"/>
            <class name="testSuite.CustomerSearchPageTest"/>
            <class name="testSuite.HomePageTest"/>
            <class name="testSuite.HomeZoneTest"/>
            <class name="testSuite.ImportLogTest"/>
            <class name="testSuite.InfleetPageTest"/>
            <class name="testSuite.LoginPageTest"/>
            <class name="testSuite.MembersArea1Test"/>
            <class name="testSuite.MembersArea2Test"/>
            <class name="testSuite.MembersArea3Test"/>
            <class name="testSuite.PromoPageTest"/>
            <class name="testSuite.TicketsTest"/>
        </classes>
    </test>
</suite>

Вот тест:

@BeforeMethod(alwaysRun = true)
public void setUp() throws Exception {
    DriverFactory.french = false;
    WEB_DRIVER_THREAD_LOCAL.set(new EventFiringWebDriver(DriverFactory.getDriver(TestUtil.getTargetBrowser())).register(new WebEventListener()));

    on = new Pages(WEB_DRIVER_THREAD_LOCAL.get());
    wait = new WebDriverWait(WEB_DRIVER_THREAD_LOCAL.get(), TestUtil.ELEMENT_PRESENT_WAIT);
}

@Test(groups = {"registration"})
public void verifyCustomerCanRectifyError() throws Exception{
    on.MembersRegistrationPage()
            .typeIn(on.MembersRegistrationPage().firstNameInput, customer.getFirstName())
            .click(on.MembersRegistrationPage().continueButton)
            .waitForVisibilityOfElement(on.MembersRegistrationPage().requestDrRecordButtonXPATH);

    assertTrue(on.MembersRegistrationPage().requestDrRecordHeader.isDisplayed());
}

Есть идеи, почему классы можно распараллеливать, а методы - нет?

1 Ответ

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

NoSuchElementException означает, что драйвер не находит элемент и истекает время ожидания (что, по-видимому, не связано с параллельным выполнением тестов. Я подозреваю, что ваша проблема связана с тем, как вы создаете экземпляр браузера, но яне могу сказать, так как у вас есть ссылки на код, который, кажется, живет в другом месте (например: WEB_DRIVER_THREAD_LOCAL). Это прекрасно работает для меня (проверено с использованием gradle):

public class Sample {
  private static ThreadLocal<RemoteWebDriver> drivers = new ThreadLocal<>();

  @BeforeMethod
   public void setUp() throws MalformedURLException {
     RemoteWebDriver driver = new RemoteWebDriver(new URL("http://127.0.0.1:4444/wd/hub"), DesiredCapabilities.chrome());
     drivers.set(driver);
  }

  @Test
  public void testOne() {
    System.out.println("Launching Thread [" + Thread.currentThread().getId() + "]");
    getDriver().get("https://www.google.com");
  }

  @Test
  public void testTwo() {
    System.out.println("Launching Thread [" + Thread.currentThread().getId() + "]");
    getDriver().get("https://www.stackoverflow.com");
  }

  @AfterMethod
  public void tearDown() {
    getDriver().quit();
  }

  @AfterClass
  public void removeThread() {
    drivers.remove();
  }

  private RemoteWebDriver getDriver() {
    return drivers.get();
  }
}

Кроме того, в вашем gradleфайл, убедитесь, что вы определили имя используемого вами XML-файла testng:

test {
  useTestNG() {
    useDefaultListeners = true 
    suites 'testng.xml' //location of the testng file
  }
}

Файл TestNG:

<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >

<suite name="Sample" parallel="methods" thread-count="2" >
  <test name="SampleTest" >
    <classes>
        <class name="Sample" />
    </classes>
  </test>
</suite>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...