我有以下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
错误是“超时”,而不是“不存在”。
所以,代码似乎没有意识到:
添加了:
我正在改变我想要找到的特定元素。
原因:我的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分钟。
答案 0 :(得分:0)
鉴于元素位于iframe中,有两点需要注意:
假设页面上只有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")