Robot Framework 验证是不是打开了新的浏览器选项卡

Posted

技术标签:

【中文标题】Robot Framework 验证是不是打开了新的浏览器选项卡【英文标题】:Robot Framework verify a new browser tab was openedRobot Framework 验证是否打开了新的浏览器选项卡 【发布时间】:2013-06-18 00:49:14 【问题描述】:

对于我们页面上的一些网络链接,有外部链接可以引导用户说 Facebook 和 Twitter。这些链接使用 HMTL 标签 target="_blank",以便为我们的 Twitter 页面打开一个新的浏览器选项卡。

我想验证 1. 新浏览器选项卡是否打开,2. 将焦点设置在它上面,以及 3. 验证新浏览器选项卡中的页面元素。一旦我专注于它,#3 部分就很容易了。不过任务 #1 和 #2,我想不通,也找不到任何人在谈论这个。

使用 Selenium2Library (WebDriver)

【问题讨论】:

【参考方案1】:

Selenium 不支持选项卡(截至 2013 年 6 月,Selenium 2.33.0)并且总是打开新窗口。如果您的测试打开一个新标签页,祝您好运。

也就是说,如果它正确打开一个新窗口,请使用Select Window

Select Window | url=https://twitter.com/expectedPage

我在Java 中的工作 WebDriver (2.33.0) 代码,希望它会有所帮助。你描述的问题是我的机器人知识开始下降的地方。

@Test
public void targetBlankLinkTest() 
    // load the website and make sure only one window is opened
    driver.get(file("TargetBlankLinkTest.html"));
    assertEquals(1, driver.getWindowHandles().size());

    // click the link and assert that a new window has been opened      
    driver.findElement(By.linkText("Follow us on Twitter!")).click();
    Set<String> windowHandles = driver.getWindowHandles();
    assertEquals(2, windowHandles.size());

    // switch to the new window and do whatever you like
    // (Java doesn't have Switch Window functionality that can select by URL.
    // I could write it, but have been using this trick instead)
    for (String handle : windowHandles) 
        if (handle != driver.getWindowHandle()) 
            driver.switchTo().window(handle);
        
    
    assertThat(driver.getCurrentUrl(), containsString("twitter.com"));

【讨论】:

谢谢,Slanec。但是,有什么方法可以至少验证一个新的浏览器选项卡是否已打开? @Dave 最接近的是Get Window Identifiers,它会在窗口打开后再返回一个值。为此,我一直使用它的 Java 版本。 ... 或者干脆执行Select Window 方法并验证其中的某些内容(Title Should Be?),如果失败,则表示尚未打开。 尝试使用 Select Window ,它不起作用。去看看Get Window Identifiers,看看我能不能把它拉下来。 @Dave 有趣。我已经编写了适合我的纯 WebDriver 代码,因此我会将其编辑为答案,以便您可以使用等效方法来模仿它。我知道您正在使用 Robot Framework,但坦率地说,似乎没有人会出现并提供帮助,所以至少有总比没有好:(...【参考方案2】:

如果您想验证是否打开了新选项卡,则只需比较单击打开新选项卡的链接/元素之前和之后的窗口句柄即可。只需遵循此代码可能会对您有所帮助。

这里 $LINKDIN 是在新标签中打开的元素。因此,在单击它之前将窗口句柄保存在变量中,并在再次单击元素后将窗口句柄保存在变量中。现在如果打开一个新的标签,那么两个变量的值都会不同,如果没有打开新的标签,那么两个变量的值都是一样的。这样你就可以验证新的 wtab 打开了。

 Go Back
 $Current_window        List Windows
 Click Element            $LINKDIN
 $New_Windows_list      List Windows
 Should Not Be Equal      $Current_window    $New_Windows_list

【讨论】:

【参考方案3】:

使用 Robot Selenium2Library 关键字:

@windows =  List Windows
$numWindows =  Get Length  $windows
$indexLast =  Evaluate  $numWindows-1
Should Be True  $numWindows > 1
Select Window  @windows[$indexLast]
Location Should Contain  /my/url/whatever
Title Should Be   myTitle
Page Should Contain   ...

你明白了。

【讨论】:

【参考方案4】:

我推荐:

1. First, acquire new window handle by using the switchTo() method.
2. Then bring that window into focus using a javascriptExecutor:
   ((JavascriptExecutor) myTestDriver).executeScript("window.focus();");
   Using switchTo() without a javascript executor to get focus , is not 
   very reliable in my opinion.
3.  Next, do what you need to do in that window.
4. Use driver.close() to close that window.
5.  Verify you are back at the parent window with focus.

【讨论】:

【参考方案5】:

你可以使用下面的代码来设置新窗口的焦点:

点击元素 $a_link_which_opensin_newtab 选择新窗口

现在您可以在新标签上执行您的操作。如果您想切换回主选项卡,请使用

选择主窗口

【讨论】:

以上是关于Robot Framework 验证是不是打开了新的浏览器选项卡的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Robot Framework、Selenium2Library、Element Text Should Be 关键字无法正确验证输入元素文本?

Robot Framework之扩展打开不同版本的谷歌浏览器

ROBOT Framework无法单击弹出接受按钮

appium+robot framework 一个测试用例

Python + Robot Framework 环境搭建

Robot Framework - 如何在 Eclipse 中导入 SeleniumLibrary 关键字实现/文档