你如何专注于使用 selenium ide 的新窗口?

Posted

技术标签:

【中文标题】你如何专注于使用 selenium ide 的新窗口?【英文标题】:How do you focus on new windows with selenium ide? 【发布时间】:2011-04-21 00:41:36 【问题描述】:

我正在尝试使用 selenium ide 来复制一个动作。该操作是单击打开新窗口的链接。你如何让 selenium ide 专注于新窗口而不是另一个?它对我不起作用。

【问题讨论】:

看看这个链接,我也发在下面,感觉selectWindow很破:jira.openqa.org/browse/SEL-703 【参考方案1】:

选择窗口

为此,您需要使用selectWindow | windowName 命令。

要从另一个窗口返回主窗口,然后执行selectWindow | null

Arguments:

    * windowID - the javascript window ID of the window to select

Selects a popup window using a window locator; once a popup window

已被选中,所有命令转到 那个窗口。选择主窗口 再次,使用 null 作为目标。

Window locators provide different ways of specifying the window object:

按标题,按内部 JavaScript “名称”或 JavaScript 变量。

    * title=My Special Window: Finds the window using the text that

出现在标题栏中。当心; 两个窗口可以共享相同的标题。 如果发生这种情况,此定位器将 随便挑一个。 * name=myWindow: 使用其内部 JavaScript 查找窗口 “名称”属性。这是第二个 参数“windowName”传递给 JavaScript 方法 window.open(url, 窗口名称,窗口特征, replaceFlag)(其中 Selenium 拦截)。 * var=variableName:一些弹窗未命名 (匿名),但与 JavaScript 变量名在 当前应用程序窗口,例如 “window.foo = window.open(url);”。在 那些情况,你可以打开窗口 使用“var=foo”。

If no window locator prefix is provided, we'll try to guess what you

意思是这样的:

1.) if windowID is null, (or the string "null") then it is assumed the

用户指的是原来的 由浏览器实例化的窗口)。

2.) if the value of the "windowID" parameter is a JavaScript variable

当前应用程序中的名称 窗口,那么假设这个 变量包含返回值 从对 JavaScript 的调用 window.open() 方法。

3.) Otherwise, selenium looks in a hash it maintains that maps string

窗口“名称”的名称。

4.) If that fails, we'll try looping over all of the known windows

尝试找到合适的 “标题”。由于“标题”不是 一定是独一无二的,这可能有 意外行为。

If you're having trouble figuring out the name of a window that you want

要操作,看看 Selenium 记录识别名称的消息 通过 window.open 创建的窗口 (因此被截获 硒)。你会看到像这样的消息 每个窗口的以下内容 打开:

debug: window.open call intercepted; window ID (which you can

与 selectWindow()) 一起使用是 “我的新窗口”

In some cases, Selenium will be unable to intercept a call to

window.open(如果调用发生在 或在“onLoad”事件之前,对于 例子)。 (这是错误 SEL-339。)在 在这些情况下,您可以强制 Selenium 通过使用注意打开的窗口的名称 Selenium openWindow 命令,使用 一个空的(空白)网址,如下所示: openWindow("", "myFunnyWindow").

选择窗口(窗口ID)

选择弹出窗口

如果是弹出窗口,则执行selectPopUp | windowId,然后返回主窗口执行selectWindow | null

selectPopUp(windowID) 参数:

windowID - 弹出窗口的标识符,可以具有多种不同的含义

简化了选择弹出窗口的过程(并且不提供超出 selectWindow() 已经提供的功能)。

如果未指定 windowID 或指定为“null”,则选择第一个非顶部窗口。顶部窗口是 selectWindow() 在不提供 windowID 的情况下选择的窗口。在播放多个弹出窗口时不应使用此选项。 否则,将按照以下顺序查找窗口,并考虑 windowID:
    窗口的“名称”,由 window.open() 指定 作为对窗口的引用的 JavaScript 变量 窗口的标题。这与 selectWindow 执行的有序查找相同

【讨论】:

这里的错误报告:jira.openqa.org/browse/SEL-703 是否适用于您上面概述的内容?我一直在与 selectWindow 搏斗几个小时。快把我逼疯了。 另外,不要忘记在“selectPopup”之前放置一个“waitForPopUp”,以确保在您尝试选择弹出窗口之前已完成加载。【参考方案2】:

使用 Selenium Web Driver 2 试试这个:

driver.switch_to.window(driver.window_handles.last);

【讨论】:

【参考方案3】:

您可以使用“storeAttribute”命令存储随机窗口 ID(由 Selenium IDE 生成)。您只需要将 ID 存储在变量中,然后您可以使用“selectWindow”命令选择窗口。

试试这个:

<tr>
   <td>storeAttribute</td>
   <td>link=Help Center@target</td>
   <td>window_ID</td>
</tr>

<tr>
   <td>selectWindow</td>
   <td>$window_ID</td>
   <td></td>
</tr> 

【讨论】:

【参考方案4】:

考虑一下:您是否愿意只删除target="_blank" 属性?对我来说,这是一个解决方案:

getEval
this.page().findElement('link=Facebook').removeAttribute('target'); 

在 Selenium IDE 中停留在同一窗口内有一些优势,因为它不支持目标空白。

【讨论】:

看起来我不小心投了反对票——这个解决方案非常优雅,希望我可以改进以支持投票 对于大多数用例来说,这实际上是最快、最简单的解决方案。也适用于表单!

以上是关于你如何专注于使用 selenium ide 的新窗口?的主要内容,如果未能解决你的问题,请参考以下文章

如何专注于第二个选项卡并使用 selenium webdriver 处理它

Selenium-IDE:如何验证/断言页面刷新

selenium IDE自动化脚本录制

如何使用Selenium WebDriver查找错误的链接?

如何启动selenium ide

selenium IDE是啥,有啥用