Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Как заранить тест через selenium grid на нескольких браузерах одновременно ? Посоветуйте самий простой вариант ?

selenium-grid
webdriver
Теги: #<Tag:0x00007f7b62935f00> #<Tag:0x00007f7b62935dc0>

(Taras) #1

Сейчас у меня такая вот фигня:

Usage в коде такой:

public class TestBaseGrid {

protected RemoteWebDriver rmtWebDriver;
protected ThreadLocal<RemoteWebDriver> threadDriver = new ThreadLocal<RemoteWebDriver>();;
protected GridDriver gridDriver;

@Parameters({ "browserName" })
@BeforeMethod
public void init(String browserName) throws Exception {
	gridDriver = new GridDriver();
	rmtWebDriver = gridDriver.getInstance(browserName);
	threadDriver.set(rmtWebDriver);
	getDriver().manage().timeouts()
			.implicitlyWait(30, TimeUnit.SECONDS);
}

@AfterMethod
public void reopenApp() throws Exception {
	getDriver().close();
}

@AfterSuite
public void reopenApp1() throws Exception {
	// HERE IS NULL !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	//System.out.println(getDriver());
}

public WebDriver getDriver() {
	return threadDriver.get();
}

@Test
// frames example
public void simpleRemoteDriverTest1() {
	try {
		getDriver().get("http://www.lits.com.ua");
		getDriver().findElement(
				By.xpath("//a[contains(@class,'red-btn-small')]")).click();
		getDriver().switchTo().frame(
				getDriver().findElement(By.id("JotFormIFrame")));
		Assert.assertTrue(getDriver().findElement(By.id("input_4_area"))
				.getAttribute("placeholder").equals("067"));
	} catch (Exception e) {

	} finally {
		//getDriver().switchTo().defaultContent();
	}
}

@Test
// Select example
public void simpleRemoteDriverTest2() throws InterruptedException {
	getDriver().get("http://www.auto.ria.ua");
	Select autoType = new Select(getDriver().findElement(
			By.id("select_auto_used_bodystyle")));
	autoType.selectByIndex(5);

	Assert.assertTrue(autoType.getOptions().size() == 12);

	Thread.sleep(5000);
}

@Test
// Explicit Waiters examples
public void simpleRemoteDriverTest3() throws IOException,
		InterruptedException {
	getDriver().get("http://google.com.ua/");
	getDriver().findElement(By.name("q")).sendKeys("LQAS" + "\n");

	WebDriverWait wait = new WebDriverWait(getDriver(), 15);
	wait.until(ExpectedConditions.textToBePresentInElement(getDriver()
			.findElement(By.id("resultStats")), "000"));

	Assert.assertTrue(getDriver().findElements(By.xpath("//h3")).get(0)
			.getText().contains("Lviv"));
}

}

и xml файл:

<?xml version="1.0" encoding="UTF-8"?>
<suite name="General test suite" parallel="tests" thread-count="4">
    <tests>
        <test name="SingleTestSuite2" parallel="tests" thread-count="3">
            <parameter name="browserName" value="firefox" />
            <classes>
                <class name="grid.selenium.test.TestBaseGrid" />
            </classes>
        </test>
        <test name="SingleTestSuite1" parallel="tests" thread-count="3">
            <parameter name="browserName" value="chrome" />
            <classes>
                <class name="grid.selenium.test.TestBaseGrid" />
            </classes>
        </test>
    </tests>
</suite>

Вопрос - как передавать браузери просто как то через запятую, или как то так что б их не получать с xml-лки , а то дубликат получаеться…?


(Sergey Korol) #2

Посоветуйте самий простой вариант ?

То, что у вас сейчас в xml - и есть самый простой вариант. Остальные варианты потребуют дополнительных телодвижений. Хотите заморочиться - создавайте пул браузеров, чекайте кол-во test блоков и thread-count в рантайме, и выделяйте browser per test из пула. Главный вопрос - надо ли оно вам? :wink:


(Taras) #3

так типа надо ))
ну пул создать понятно, что значит чекать количество тест блоков ? Я так понимаю во скольких сридах запускать каждий тест метод с xml файла все равно нужно положить на testng ? Просто я так понимаю количество запусков должно бить такое как сайз пула с браузерами…


(Sergey Korol) #4

Ну вы параллелите по тестовым блокам. Логично, что вам нужно знать их кол-во, чтобы сопоставить с размером пула и числом доступных потоков, и иметь возможность устанавливать разумные ограничения. Вот вы поставили thread-count = 3/4. Числа, взятые с потолка? Зачем вам 3/4 потока на 2 тестовых блока? Как будете выделять браузеры из пула, если число тестовых блоков превышает размер пула? TestNG то все равно, он запустит свой поток, а пул будет пуст. Какие ваши действия?

К слову, не понятно, зачем вы дублируете parallel / thread-count внутри каждого блока в отдельности? Эти параметры достаточно задать на уровне suite.

Не понял вопроса.

О каком кол-ве запусков речь?

Тут надо копать глубже. Для полноценного использования грида одного имени браузера - недостаточно. Отсюда вопрос - какого типа данные вы собираетесь хранить в пуле?


(Taras) #5

дублирование parallel thread-count ето просто копи паст…

“Я так понимаю во скольких сридах запускать каждий тест метод с xml файла все равно нужно положить на testng ?”
Имееться ввиду что например у меня в какой то проперти приходит firefox,chrome,ie - значит нужно заранить тести на етих 3-ех браузерах паралельно. Тогда мне нужно в срид пуле 3 браузера как я понимаю , поетому если я передаю 3 браузера - значит количество потоком должно бить 3 - вот так мне нужно сделать…ну и соотвественно что б каждий тест метод из xml- сюта заранился на на каждом браузере


(Sergey Korol) #6

Всего-то… А то, что такие моменты усложняют читаемость вашего кода и снижают вероятность того, что кто-либо захочет в нем копаться, - вас не смущает?

Ну так в чем проблема? Меняйте thread-count в рантайме через контекст на основании browser pool size. Я об этом выше и писал. Но вопрос о содержимом пула все еще остается открытым. У вас может быть, к примеру, 50 нод с похожими конфигурациями. Как собираетесь сетить capabilities на основании одного лишь имени браузера?


(Taras) #7

ето просто бил тестовий пример, где я експерементировал с thread-count i parallel для разних в testng, по етому засетал 2 раза.

Да в том то и дело, что особих капабилитиз у меня нету, только название браузера…и desiredCapabilities.setCapability(CapabilityType.TAKES_SCREENSHOT, true); вот и все. Короче попробую, спасибо большое