切换到没有名字的窗口

时间:2013-07-17 09:39:05

标签: codeception

使用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似乎没有太多功能。

4 个答案:

答案 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);
});