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

PhantomJSDriver, SessionNotFoundException.


#1

Доброго времени суток. Не могу разобраться с проблемой в PhantomJSDriver.

Есть веб-приложение с такой структурой:

<html...>
	<head>...</head>
	<body...>
		<form...>
			<iframe... src = "someSrc1"></iframe> //popup1
			<iframe... src = "someSrc2"></iframe> //popup2
		</form>
	</body>
</html>

Есть тестовый скрипт, который делает следующее:
1 - с главной страницы открывается popup1.
2 - для работы с этим фреймом переводится фокус с помощью вызова

driver.switchTo().frame(driver.findElement(By.xpath("//iframe[contains(@src,'someSrc1')]")));

3 - идет работа с элементами этого фрейма.
4 - закрытие фрейма и перевод фокуса обратно на главную вызовом

driver.switchTo().defaultContent();

5 - далее открывается popup2
6 - идет работа с элементами этого фрейма.
7 - закрытие фрейма и перевод фокуса обратно аналогичным путем

В Chrome и FF все работает хорошо, а вот при запуске этого скрипта в GhostDriver ловлю такое исключение на 7-ом шаге:

WARN 01/27 12:40:46 b.n.w.a.a.Webmetric~ - ERROR: Error communicating with the remote browser. It may have died. at line 93
WARN 01/27 12:40:46 b.n.w.a.a.Webmetric~ - Failed to dispatch 'before environment cleanup' event
org.openqa.selenium.remote.SessionNotFoundException: Session ID is null. Using WebDriver after calling quit()?
Build info: version: '2.41.0', revision: '3192d8a6c4449dc285928ba024779344f5423c58', time: '2014-03-27 11:29:39'
System info: host: 'BY01-988', ip: '10.10.100.146', os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.7.0_71'
Driver info: driver.version: PhantomJSDriver
	at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:279)
	at org.openqa.selenium.phantomjs.PhantomJSCommandExecutor.execute(PhantomJSCommandExecutor.java:82)
	at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:568)
	at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:610)
	at org.openqa.selenium.phantomjs.PhantomJSDriver.getScreenshotAs(PhantomJSDriver.java:115)
	at biz.neustar.webmetrics.agent.ScreenshotUtils.takeScreenshot(ScreenshotUtils.java:48)
	at biz.neustar.webmetrics.validator.ValidationReporter.takeScreenshot(ValidationReporter.java:69)
	at biz.neustar.webmetrics.validator.ScriptTester$2.beforeEnvironmentCleanup(ScriptTester.java:119)
	at biz.neustar.webmetrics.agent.api.WebmetricsControl.dispatchBeforeEnvironmentCleanupEvent(WebmetricsControl.java:1530)
	at biz.neustar.webmetrics.agent.api.WebmetricsControl.cleanup(WebmetricsControl.java:897)
	at biz.neustar.webmetrics.agent.selenium.JavaScriptExecutor.run(JavaScriptExecutor.java:308)
	at java.lang.Thread.run(Unknown Source)

quit() явно нигде не вызываю

//каркас
function main() {
    StartTest("http://...");
    TestBody();
    EndTest();
};

StartTest - инициализация теста, открытие урла и пр.
в TestBody просто клики и смены фокусов.
EndTest - завершение теста, закрытие браузера.

Тест падает именно на втором switchTo().defaultContent()…
для проверки менял порядок открытия фреймов, все равно на втором.

Буду рад любым идеям, уже запарился.


(Максим Малунов) #2

я бы попробовал что-то такое

public void closeFrame(String parentWindowHandle) {
        Set<String> windows = webDriver.getWindowHandles();
        for (String window : windows) {
            if (!parentWindowHandle.equals(window))
                webDriver.close();
        }
        webDriver.switchTo().window(parentWindowHandle);
    }

parentWindowHandle = через webDriver.getWindowHandle();


#3

Коллекция driver.getWindowHandles() до и после открытия фрейма одинаковая. Насколько я понимаю, window применяется в случае работы именно с отдельными окнами браузера, а у меня iframe’ы внутри одного window’а…


(Sergey Korol) #4

Теоретически такое возможно, если на 7м шаге, вместо / вместе с фреймом закрылось основное окно браузера, ибо эксепшен как раз таки на это и указывает. Так что советую для начала перепроверить ваши закрытия / перефокусировки в дебаге.