为什么我找不到使用XPath的按钮?

时间:2014-10-12 19:21:56

标签: xpath watir

我有以下HTML:

<input type="button" value="Close List" class="tiny round success button" id="btnSaveCloseListPanel">

以下代码不起作用:

# browser.button(:value => "Close List").click   # does not work - timeout
browser.button(:xpath => "/html/body/center/div/div[9]/div[2]/input[2]").when_present.click

错误是:

Watir::Wait::TimeoutError:
timed out after 60 seconds 

when_present(300)不起作用。

我使用Firefox开发人员工具找到了XPath。我使用完整的路径来避免任何愚蠢的错误。我可以在IE中手动找到相同的路径。

该组件是.NET MVC弹出窗口。我认为它被称为“小组”。该面板是Internet Explorer选项卡的孙子。

该面板包含一个日期选择器,一个下拉菜单,一个文本框和3个按钮。我找不到使用Watir的任何一个。我可以在面板的父母中找到任何东西(显然)。

底层代码似乎并不知道实际上不存在某些东西。为了证明这一点,我测试了下面的XPath,它只是上面的XPath,删除了中间位:

browser.button(:xpath => "/html/body/center/div/input[2]").when_present.click

错误是“超时”,而不是“不存在”。

所以,代码似乎没有意识到:

  • 输入[1]不存在,因此输入[2]不存在。
  • div [2]不存在。
  • 因此没有什么可以搜索的。

添加了:

我正在改变我想要找到的特定元素。

原因:我的OP中的按钮位于面板的底部。我正在试图跨越数百行HTML。相反,我现在正在使用面板中的第一个字段。以前的所有信息都是一样的。

第一个字段是带有datepicker的文本字段。

HTML是:

<input type="text" value="" style="width:82px!important;" readonly="readonly" name="ListDateClosed" id="ListDateClosed" class="hasDatepicker">

在Firefox中使用F12,XPath是:

/html/body/center/div/div[1]/div[2]/input

但是,现在,由于HTML行数少得多,我可以清楚地看到html标记不是文件中最顶层的html标记。 html的父级是iframe

我之前从未使用过iframe。也许这就是t0mppa在他对第一个问题的评论中所指的那个。

作为一项实验,我将XPath修改为:

browser.text_field(:xpath, '//iframe/html/body/center/div/div[1]/div[2]/input').when_present.set("01-Aug-2014")

但这次超时,即使是超时3分钟。

1 个答案:

答案 0 :(得分:0)

鉴于元素位于iframe中,有两点需要注意:

  • 与其他元素类型不同,您必须始终告诉Watir何时元素位于iframe中。
  • XPath(在Watir的上下文中)不能用于跨框架。

假设页面上只有1个iframe,您可以明确告诉Watir使用iframe方法搜索第一个iframe:

browser.iframe.text_field(:xpath, '//body/center/div/div[1]/div[2]/input').when_present.set("01-Aug-2014")

如果有多个iframe,您可以使用常用的定位器来更具体地说明哪个iframe。例如,如果iframe有一个id:

browser.iframe(id: 'iframe_id')
  .text_field(xpath: '//body/center/div/div[1]/div[2]/input')
  .when_present
  .set("01-Aug-2014")