使用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 :(得分:4)
在搜索了Selenium论坛以及来自@Mark Rowlands的一些有用的刺激之后,我使用原始Selenium开始工作。
// 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);
});
返回父窗口很简单,因为我可以使用Codeception的switchToWindow
方法:
$I->switchToWindow();
答案 1 :(得分:1)
基于接受的答案,在Codeception 2.2.9中,我能够将此代码添加到“接受帮助器”中,并且似乎可以正常工作。
/**
* @throws \Codeception\Exception\ModuleException
*/
public function switchToNewWindow()
{
$webdriver = $this->getModule('WebDriver')->webDriver;
$handles = $webdriver->getWindowHandles();
$lastWindow = end($handles);
$webdriver->switchTo()->window($lastWindow);
}
然后在测试类中,我可以这样做:
$I->click('#somelink');
$I->switchToNewWindow();
// Some assertions...
$I->switchToWindow(); // this switches back to the previous window
我曾经有一段时间尝试仅通过搜索google来找到解决方法,所以我希望它能对其他人有所帮助。
答案 2 :(得分: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.
我希望能帮助你。
答案 3 :(得分:0)
使用Codeception 2.2+,它看起来像这样:
$I->executeInSelenium(function (\Facebook\WebDriver\Remote\RemoteWebDriver $webdriver) {
$handles = $webdriver->getWindowHandles();
$lastWindow = end($handles);
$webdriver->switchTo()->window($lastWindow);
});