首页 文章

Selenium IDE无法找到组件

提问于
浏览
2

我正在使用Selenium IDE测试ADF应用程序 . 有一次,自动化测试用例必须单击一个按钮,该按钮具有指向页面上的表的 partialTrigger 属性,并且在按钮执行某些背景逻辑之后,该表将填充行,但是 page is not fully refreshed .

我面临的问题是Selenium IDE在单击按钮后无法找到表行 . 可能,Selenium不知道页面的DOM更新,但我不确定 .

到目前为止我尝试过的是:

  • 我在表格的第一行中存储了一个单元格的预期完整xpath .

  • 创建了一个自动执行的JavaScript函数,用于单击给定的路径 .

  • 我在一个简单的HTML页面上测试了以下命令,它们工作正常 .

Selenium命令:

<tr>
    <td>store</td>
    <td>//html[1]/body[1]/div[1]/table[1]/tbody[1]/tr[1]/td[1]</td>
    <td>myTableRowPath</td> <!-- store the xpath with name 'myTableRowPath' -->
</tr>
<tr>
    <td>storeEval</td>
    <td>(function(path) { 
         var result = selenium.browserbot.getUserWindow()
                     .document.evaluate(path,
                                        selenium.browserbot.getUserWindow().document,
                                        null, 
                                        8, 
                                        null).singleNodeValue; result.click(); 
                     return null;
        })
        (${myTableRowPath})
   </td>
    <td>elementToBeClicked</td>
</tr>

如何让Selenium IDE了解页面上的任何(AJAX)DOM更新?

3 回答

  • 2

    通常,在Selenium IDE上处理AJAX时,您需要使用 waitForElementPresent 类型的操作 .

    例如,如果您的表格发生变化

    <table id="myTable">
      <tbody>
        <tr>
          <td>foo</td>
          <td>bar</td>
        </tr>
      </tbody>
    </table>
    

    <table id="myTable">
      <tbody>
        <tr>
          <td>foo</td>
          <td>bar</td>
        </tr>
        <tr>
          <td>something</td>
          <td>else</td>
        </tr>
      </tbody>
    </table>
    

    您可以使用:

    <tr>
        <td>click</td>
        <td>//input[@id='myButton']</td>
        <td></td>
    </tr>
    <tr>
        <td>waitForElementPresent</td>
        <td>//table[@id='myTable']/tbody/tr[2]</td>
        <td></td>
    </tr>
    <tr>
        <td>assertText</td>
        <td>//table[@id='myTable']/tbody/tr[2]/td</td>
        <td>something</td>
    </tr>
    

    Here's一个JSFiddle我对它进行了测试(没有AJAX,但是使用缓慢的JS函数模拟它) .

  • 2

    ADF以一种很难维护XPath的方式操纵生成的HTML . 在ADF中定位特定元素的最简单方法是为此元素提供styleClass并使用class属性访问它 .

  • 1
    • ADF在加载表的内容之前加载表UI(ID selenium正在寻找) . 您的webdriver可能在加载之前查找内容,因此您可以在单击该行之前明确等待一小段时间 .

    • 您的表可能正在使用延迟加载,当您将其滚动到视图中时,它只加载表的内容 . 如果您的窗口只显示5行,并且表中有10行,则浏览器将只加载5行 . 如果你要求selenium查找第8行,它将抛出异常 . 我通过单击第一行和driver.switchTo() . activeElement() . sendKeys(Keys.DOWN)解决了这个问题 . 我搜索的行数的次数 . 所以在访问它之前我是"scrolling"

相关问题