使用Selenium处理浏览器弹出窗口

21

我们正在针对现有代码库运行Selenium回归测试,我们的Web应用程序中的某些屏幕使用弹出窗口作为中间步骤。

目前,我们在测试中使用以下命令:

// force new window to open at this point - so we can select it later
selenium().getEval("this.browserbot.getCurrentWindow().open('', 'enquiryPopup')");
selenium().click("//input[@value='Submit']");
selenium().waitForPopUp("enquiryPopup", getWaitTime());
selenium().selectWindow("enquiryPopup");

...它在大多数情况下都有效。偶尔会在waitForPopUp()行上失败测试。

com.thoughtworks.selenium.SeleniumException: Permission denied

有人能建议更好、更可靠的方法吗?

此外,我们主要在IE6和7上运行这些测试。


2
这个线程到底怎么了?下面有5个不同的人试图劫持它! - ryeguy
5个回答

4

太棒了!只是为了让更喜欢使用selenese的人更容易理解。

我使用IE7(普通模式)时成功了。

真是一个麻烦事。感谢天上的意大利面怪物,没有Stack Overflow我绝对不可能在IE中使其正常工作。

<tr>
    <td>getEval</td>
    <td>selenium.browserbot.getCurrentWindow().open('', 'windowName');</td>
    <td></td>
</tr>
<tr>
    <td>click</td>
    <td>buttonName</td>
    <td></td>
</tr>
<tr>
    <td>windowFocus</td>
    <td>windowName</td>
    <td></td>
</tr>
<tr>
    <td>waitForPopUp</td>
    <td>windowName</td>
    <td>3000</td>
</tr>
<tr>
    <td>selectWindow</td>
    <td>windowName</td>
    <td></td>
</tr>

这对我没有作用,除非我把windowFocus移动到最后一个命令执行。在waitForPopUp之前放置它没有任何意义,是吗? - Chris Noe

1

如果您正在运行*iehta模式,则可能会遇到一些小问题。 我们在我的工作中运行Selenium,似乎IE和AJAX存在许多问题。

但是,听起来您遇到的问题是Selenium尝试在完全加载组件之前访问另一个窗口中的组件。 我不确定您的默认超时范围设置为多少,但您可能需要将其增加到60(60000毫秒)秒左右以解决此问题。

除此之外,我建议您在Firefox中运行测试(使用*chrome),因为它可以产生更可靠的结果,但有时由于业务要求而无法实现。


相信我,我希望我们可以在Firefox中运行它!但是我们99%的用户都在IE上,因此这是测试的优先事项...我们使用iexplore,而不是iehta。我不知道有什么区别? - brasskazoo
iehta和chrome都支持https。这样你就不用担心由证书引起的问题了。 - Josh

0

我需要选中弹出窗口中的 iframe 并填写表单。

使用 selectWindow 命令时,Selenium 找不到我的 iframe,所以我将该命令删除了。

以下这个 Selenese 对我很有效(其中 iframe 的标题和 id 都为 account_frame):

<tr>
  <td>click</td>
  <td>//a[@class='item_add']</td>
  <td></td>
</tr>
<tr>
  <td>windowFocus</td>
  <td>account_frame</td>
  <td></td>
</tr>
<tr>
  <td>waitForPopUp</td>
  <td>account_frame</td>
  <td>10000</td>
</tr>

0

我刚试用了另一个Selenium函数,windowFocus()

// force new window to open at this point - so we can select it later
selenium().getEval("this.browserbot.getCurrentWindow().open('', 'enquiryPopup')");
selenium().click("//input[@value='Submit']");
selenium().windowFocus("enquiryPopup");
selenium().waitForPopUp("enquiryPopup", getWaitTime());
selenium().selectWindow("enquiryPopup");

当我在本地运行测试时,只有使用所有这些方法调用 - 创建/聚焦/等待/选择,测试才能成功。

我将让构建服务器运行所有测试,如果那也成功了,我将把它制作成库函数…!


目前为止,它一直在工作,所以我打算使用弹出窗口将其扩展到所有测试中(我们最终会转移到灯箱)。 - brasskazoo

-1

尝试在导致问题的调用周围添加一些等待语句。

我以前也遇到过同样的错误,唯一能够可靠地解决它们的方法是通过调用System.Threading.Thread.Sleep(5000)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接