3

使用 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

4 回答 4

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();
于 2013-07-17T10:25:18.027 回答
3

在接受的答案的基础上,在 Codeception 2.2.9 中,我能够将此代码添加到 Acceptance Helper 并且它似乎可以工作。

/**
 * @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

我花了很长时间试图通过搜索谷歌来弄清楚如何做到这一点,所以我希望它对其他人有所帮助。

于 2018-07-26T23:41:43.407 回答
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.

我希望能帮助你。

于 2013-07-17T10:12:46.450 回答
0

使用 Codeception 2.2+ 它看起来像这样:

$I->executeInSelenium(function (\Facebook\WebDriver\Remote\RemoteWebDriver $webdriver) {
    $handles = $webdriver->getWindowHandles();
    $lastWindow = end($handles);
    $webdriver->switchTo()->window($lastWindow);
});
于 2017-03-16T15:24:06.740 回答