我可以使用以下命令在列表中找到2个项目:
br.span(:text, "Customer").click
但是其他人给了我一个Selenium::WebDriver::Error::ElementNotVisibleError
。我可以选择列表中的某些项目并且Watir可以看到,这似乎有点奇怪。下面是html。我可以选择电信配置文件,但不能选择机会。有关为什么可以看到一个而不是另一个的想法?
<TD style="PADDING-BOTTOM: 3px; PADDING-LEFT: 2px; PADDING-RIGHT: 2px; PADDING-TOP: 3px" id=apy0m1i2ITD vAlign=center width="100%" noWrap align=left>
<SPAN style="MARGIN: 0px 13px">Opportunity</SPAN>
</TD>
</TR></TBODY></TABLE></TD></TR>
<TD style="PADDING-BOTTOM: 3px; PADDING-LEFT: 2px; PADDING-RIGHT: 2px; PADDING-TOP: 3px" id=apy0m1i3ITD vAlign=center width="100%" noWrap align=left>
<SPAN style="MARGIN: 0px 13px">Telecom Profile</SPAN>
</TD>
</TR></TBODY></TABLE></TD></TR>
答案 0 :(得分:1)
如果元素不可见,则WebDriver无法单击该元素。
在元素变得可见之前页面是否在变化?如果是这样,试试这个:
br.wait_until { br.span(:text => 'Customer').visible? }
br.span(:text, "Customer").click
答案 1 :(得分:0)
首先,您说'从列表中选择',但您显示的HTML中不存在HTML select元素,只有表格和行。所以这让我觉得你的'list'控件是某种javascript动画小部件,来自jQuery或类似的库。
许多工作的方式是他们构建看起来像下拉菜单的东西,但然后设置类使得东西不可见。当您执行某些操作(例如点击或鼠标悬停)到下拉列表的顶部时,它会将类更改为CSS渲染可见的类。通常他们会使用一种叫做伪类的东西,这种东西是由鼠标悬停在项目上的,因此一旦显示菜单,只要鼠标悬停在菜单上,它就会一直显示。
自动化这些可能特别棘手,因为webdriver不会移动实际的鼠标指针来创建鼠标悬停或悬停事件。因此,您可以执行某些操作以显示菜单,例如单击菜单顶部,但随后浏览器可以非常快速地检测到鼠标未被覆盖,并且繁荣,它再次隐藏。
通过设计,使用webdriver来驱动浏览器(watir-webdriver,Selenium,Capybara)的任何东西都不会从用户的角度点击或与“不存在”的元素进行交互(也就是说可见并启用)。通常这很好,如果用户无法点击它,那么自动化工具为什么要点击它呢?这很可能是'不可见'消息的来源,那个网络驱动程序说'嘿我可以在DOM中找到这个东西,但它对用户来说是不可见的,所以你不能点击它。
我经常从IRB解决这些页面问题,在watir-webdriver命令中触发我认为会使菜单出现,然后单击该元素。如果你可以让它工作,那么它可能会起作用以脚本速度。
有时你需要使用'when present'装饰器,例如,某些东西会因为之前的动作而变得可见或产生,并且你不想过早地尝试与它进行交互。 / p>
browser.span(:text => "Customer").when_present.click
这比@ TrinitronX的建议更优雅,但基本上是同样的事情
然而,如果问题是元素出现并在正在执行的一行代码和下一行代码之间消失,那么这种方法对你没有帮助。如果它消失得太快。
在这种情况下,您可能不得不求助于执行某些javascript来改变元素的样式以强制它可见。或者您可以尝试手动触发元素上的onclick事件,看看是否会导致javascript响应,就像您单击它一样。
如果没有看到网站本身或对其具有相同控制权的示例网站,有时很难知道操作元素的最佳解决方案是什么