2013-07-17 16 views
1

Используя платформу тестирования Codeception и модуль Selenium 2 для тестирования веб-сайта, я заканчиваю гиперссылку, которая открывает новое окно без имени. В результате функция switchToWindow() не будет работать, потому что она пытается переключиться на родительское окно (которое я сейчас нахожу). Не имея возможности переключиться в новое окно, я не могу выполнить никаких тестов.Переход к окну без имени

<a class="external" target="_blank" href="http://mylocalurl/the/page/im/opening"> 
    View Live 
</a> 

Использование как Chrome и Firefox отладки я могу подтвердить новое окно не имеет имя, и я не могу дать ему один, потому что я не могу изменить страницу HTML я работаю над. В идеале я бы поменял HTML на использование javascript onclick="window.open('http://mylocalurl/the/page/im/opening', 'myPopupWindow'), но это невозможно в моем случае.

Я огляделся на форумах Selenium без какого-либо четкого метода решения этой проблемы, и Codeception, похоже, не обладает большой функциональностью.

+0

Есть ли ' getWindowNames() 'введите команду в Codeception? Извините, я не могу найти документацию. –

+0

Нет, документация практически не существует (хотя и улучшается с течением времени), однако большинство функций являются расширениями методов Selenium 2. Я считаю, что могу выполнить * некоторые методы Selenium 2, но какие и сколько я понятия не имею. Документы: http://codeception.com/docs/modules/Selenium2 – Tro

+1

Вау, это настоящий маринад. Я думаю, что 'executeInSelenium' будет вашим лучшим выбором. Глядя в привязку к привязкам PHP webdriver, он имеет доступ к методам 'getWindowHandle()' и 'getWindowHandles()'. Поэтому я мог только опасаться, что вы 'getWindowHandle()' перед тем, как открыть новое окно 'getWindowHandles()' после. Это означает, что вы знаете два имени, чтобы вы могли извлечь имя «нового окна» из массива, полученного из 'getWindowHandles()'. Надеюсь, это дало вам некоторые идеи следующего шага, поскольку, к сожалению, я не могу понять, как написать пример кода. –

ответ

4

После поиска на форуме Selenium и некоторых полезных отступов от @Mark Rowlands, я получил его для работы с использованием сырого селена.

// before codeception v2.1.1, just typehint on \Webdriver 
$I->executeInSelenium(function (\Facebook\WebDriver\Remote\RemoteWebDriver $webdriver) { 
    $handles=$webdriver->window_handles(); 
    $last_window = end($handles); 
    $webdriver->focusWindow($last_window); 
}); 

Возвращаясь к родительскому окну было легко, потому что я мог бы просто использовать switchToWindow метод Codeception в:

$I->switchToWindow(); 
+0

Обратите внимание, что при перекодировании кода v2.1.1 с facebook/webdriver 0.6.0 на 1.0+ изменилась требуемая подпись для этого закрытия. Теперь вам нужно ввести htt '\ Facebook \ WebDriver \ Remote \ RemoteWebDriver', а не' \ Webdriver \ Session', показанный здесь. (см. https://github.com/Codeception/Codeception/pull/2684) – ashnazg

0

Попробуйте это,

String parentWindowHandle = browser.getWindowHandle(); // save the current window handle. 
    WebDriver popup = null; 
    Iterator<String> windowIterator = browser.getWindowHandles(); 
    while(windowIterator.hasNext()) { 
    String windowHandle = windowIterator.next(); 
    popup = browser.switchTo().window(windowHandle); 
    } 

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

browser.close(); // close the popup. 
browser.switchTo().window(parentWindowHandle); // Switch back to parent window. 

Я надеюсь, что поможет вам.

0

Использование Codeception 2.2+ это выглядит следующим образом:

$I->executeInSelenium(function (\Facebook\WebDriver\Remote\RemoteWebDriver $webdriver) { 
    $handles = $webdriver->getWindowHandles(); 
    $lastWindow = end($handles); 
    $webdriver->switchTo()->window($lastWindow); 
}); 
Смежные вопросы