Я запускаю свою тестовую среду selenium с помощью файла testng.xml. Когда я запускаю тесты в testng.xml параллельно (разные браузеры), процент пропусков очень меньше, т. Е. 80%, но когда я запускаю testng.xml, процент прохода превышает 95. Может кто-нибудь сказать мне, почему он мог так ли?TestNg Результат параллельного выполнения показывает меньший процент пропуска в сравнении с обычным выполнением
ответ
Просьба внести следующие изменения в свой код, после чего ваши проблемы, связанные с параллелизмом, должны исчезнуть.
В вашей BrowserHandler
:
- В
getDriver(String browsername)
добавитьWebDriver driver = null
в первой строке (Мы объявляем WebDriver быть локальной переменной в настоящее время) - Удалить элемент
protected WebDriver driver=null;
данных и вместо того, чтобы включать в себя локальный вариант резьбы:private static ThreadLocal<WebDriver> driver = new ThreadLocal<>()
; - Добавить новый метод, как показано ниже:
public static WebDriver getDriver() { return driver.get(); }
public static void setDriver(WebDriver localDriver) { driver.set(localDriver); }
В вашей BaseClass
:
- В методе
launch_App()
измененияgetDriver(browsername);
кsetDriver(getDriver(browsername));
- В способе
afterMethod(ITestResult result)
изменитьdriver.quit();
наgetDriver().quit()
. - В методе
afterMethod(ITestResult result)
добавить дополнительную строкуsetDriver(null);
после заявленияgetDriver().quit();
Теперь через вне вашего тестового кода, всякий раз, когда вам нужно получить доступ к WebDriver вы должны использовать getDriver()
[Я предполагаю, что все ваши классы тестов будут распространяться на BaseClass
(который снова распространяется на BrowserHandler
)]
Чтобы узнать больше о ThreadLocal, пожалуйста, обратитесь к here.
Я также использую фабрику страниц. как передать ссылку на драйвер в классе фабрики страниц, т. е. в конструкторе, созданном в классе фабрики страниц. – Dani
Пока вы вызываете PageFactory.initElements() из метода @Test, вы все равно можете вызвать getDriver(), чтобы получить к нему доступ. –
Как я уже сказал, вам нужно убедиться, что все вызовы происходят в методе Test, потому что BeforeMethod> Test> AfterMethod будет выполняться в одном потоке, и именно так вы сможете получить доступ к webdriver, установленному в текущем контекст потока. Также, если мой ответ вам поможет, пожалуйста, примите его. –
Возможно, из-за [Условия гонки] (https://en.wikipedia.org/wiki/Race_condition) - Я голосую, чтобы закрыть этот вопрос, поскольку он слишком широк. – Augusto
@ Jim - информация, которую вы предоставили, очень мало. Его недостаточно для отладки, чтобы понять, в чем проблема. Итак, вот некоторые вопросы, на которые вы могли бы добавить ответы (отредактировав свой вопрос). 1. Всегда ли те же тесты, которые не выполняются? 2. Какова природа сбоев? Являются ли они подлинными неудачами приложений (или), они связаны с не найденным элементом и т. Д., Которые вы считаете ложными тревогами. 3. Как выглядит ваш экземпляр браузера? Можете ли вы показать код? –
Отвечая на ваши вопросы 1. Всегда ли те же тесты, которые не выполняются? - нет, это не то же самое испытание, которое терпит неудачу. 2. Какова природа сбоев? - Являются ли они подлинными неудачами приложения (или), они связаны с не найденным элементом и т. Д., Которые вы считаете ложными тревогами. - Все связаны с элементом, не найденным исключением, при работе в обычном режиме ошибок не возникает. 3. Как выглядит ваш экземпляр браузера? Можете ли вы показать код? - Я использую до метода для создания экземпляра моего драйвера. В настоящее время используют Firefox и Chrome.Я вызываю браузерную информацию из Testng xml в качестве параметра на @ beforemethod – Dani