Я выполняю свои тестовые примеры с помощью Selenium + TestNG. Мои тестовые примеры распределены по нескольким классам. Я хочу использовать одну и ту же копию webDriver с каждым классом. (Я не хочу каждый раз входить в систему, а затем выполнять другие операции, поэтому возможность вызова отдельного браузера для каждого класса пропала). Чтобы решить эту проблему, сейчас я использую наследование со статическим объектом webdriver. Но при использовании сетки селена в параллельном режиме она не работает, поскольку использует тот же объект. Не могли бы вы показать мне способ, которым я могу поделиться объектом с несколькими классами ИЛИ Для создания разных экземпляров static для каждого «теста» (это похоже на то, что я запускаю отдельную программу Java для каждого теста).
TestNG, Selenium Как разделить объект между несколькими классами
Ответы (4)
В настоящее время вы используете статическую ссылку на объект webdriver в различных классах / тестах. Итак, существует единственный экземпляр драйвера, который изменяет статические ресурсы в вашем коде. Но когда вы переходите к сетке, вы создаете разные экземпляры драйвера для каждого узла. Эти драйверы будут работать параллельно и будут обращаться к общим ресурсам (статическим переменным и т. Д.), Одновременно изменяя и отменяя изменения, сделанные другими экземплярами драйвера, что вызовет проблемы.
Напишите свой код так, чтобы ресурсы не использовались совместно (минимум статических). Попробуйте передать экземпляр драйвера в методы, чтобы убедиться, что требуемый драйвер выполняет только этот фрагмент кода.
Вот как я реализовал решение.
У меня есть объект myObj, внутри которого есть объект webDriver и еще несколько вещей. Я создал статический массив статического объекта myObj. Это вот так
// некоторая часть класса, в которой реализован WebDriver. WebDriver, кстати, не статичен.
private static MyClass[] ObjectArr = new MyClass[100];
public static MyClass getInstance(Integer id){
id = (id==null)? 0 : id;
if(ObjectArr[id] == null){
ObjectArr[id] = new MyClass();
}
return ObjectArr[id];
}
Теперь, когда я хочу использовать это в своем классе testng, я делаю это так.
public class x{
MyClass i;
@BeforeClass
@Parameters("instanceId")
public void getInstance(@Optional String instanceId){
i = MyClass.getInstance(Integer.parseInt(instanceId));
}
}
и вот как выглядит мой testng.xml.
<test name="FireFox" preserve-order="true">
<parameter name="instanceId" value="1" />
<parameter name="browser" value="firefox" />
<classes>
<class name="com.app.Login"/>
</classes>
</test>
<test name="Chrome" preserve-order="true">
<parameter name="instanceId" value="2" />
<parameter name="browser" value="chrome" />
<classes>
<class name="com.app.Login"/>
</classes>
</test>
This works perfectly for me for selenium grid in parallel and in normal way.
Я столкнулся с подобной проблемой. Вот что я сделал.
Предположение: скажем, тесты класса B зависят от экземпляра класса A.
@AfterClass(alwaysRun = true)
public void insertValueIntoAttribute(ITestContext ctx) {
ctx.setAttribute("INSTANCE_OF_A", this); // from inside class A tests
}
А затем в классе B я извлекаю этот экземпляр A и использую его.
@BeforeClass(alwaysRun=true)
@SuppressWarnings("unchecked")
public void fetchData(ITestContext ctx) {
A a = (A) ctx.getAttribute("INSTANCE_OF_A");
}
Надеюсь, это кому-то поможет.
Мы боролись с подобной ситуацией при тестировании. Мы также хотели использовать распараллеливание TestNG вместе с веб-драйвером Selenium. К сожалению, управление жизненным циклом веб-драйвера в каждом тестовом классе или попытка использовать статический класс, содержащий веб-драйвер, неэффективны при включении любого из параллельных режимов TestNG. т.е. parallel="tests|classes|methods"
. Сопоставление тестируемых классов и методов с активным потоком TestNG и созданным экземпляром веб-драйвера было громоздким, когда он вообще работал. Мы тратили больше времени на выяснение жизненных циклов веб-драйверов, чем на тестирование реальных веб-приложений. Мы нашли способ получше. У нас есть проект с открытым исходным кодом, который абстрагируется от управления жизненным циклом веб-драйверов для тестирования TestNG / Selenium. Он должным образом поддерживает каждый из параллельных режимов TestNG, обеспечивая правильный и активный веб-драйвер для каждого тестируемого метода тестового класса. Это очень помогло нам в наших усилиях по тестированию. Возможно, это пригодится и вам. Или, если ничто другое не дает вам представления о том, как вы можете решить эту проблему по-другому. Проект завершен на GitHub как Concurrent Selenium TestNG (COSENG). С уважением.