1

我可以使用以下方法在列表中找到 2 个项目:

br.span(:text, "Customer").click

但是其他人给了我一个Selenium::WebDriver::Error::ElementNotVisibleError。列表中的某些项目我可以选择而某些 Watir 可以看到,这似乎有点奇怪。下面是html。我可以选择 Telecom Profile 但不能选择 Opportunity。关于为什么可以看到一个但看不到另一个的任何想法?

<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>
4

2 回答 2

1

如果元素不可见,WebDriver 无法单击它。

在元素变得可见之前页面是否发生变化?如果是这样,试试这个:

br.wait_until { br.span(:text => 'Customer').visible? }
br.span(:text, "Customer").click
于 2013-02-20T22:22:36.240 回答
0

首先,您说“从列表中选择”,但您显示的 HTML 中没有 HTML 选择元素,只有表格和行。所以这让我觉得你的“列表”控件是某种 javascript 动画小部件,来自 jQuery 或类似的库。

很多这些工作的方式是他们构建看起来像下拉菜单的东西,然后设置类使得这些东西不可见。当您对下拉列表顶部执行某些操作(例如单击或鼠标悬停)时,它会将类更改为由 CSS 呈现可见的类。他们经常使用一种叫做伪类的东西,它是由鼠标悬停在项目上触发的,所以一旦显示菜单,只要鼠标悬停在它上面,它就会一直显示。

自动化这些可能特别棘手,因为 webdriver 不会移动实际的鼠标指针来创建鼠标悬停或悬停事件。所以你可以做一些事情来显示一个菜单,比如点击菜单的顶部,但是很快浏览器就可以检测到鼠标没有在这个东西上,然后砰,它又被隐藏了。

按照设计,几乎任何使用 webdriver 驱动浏览器(watir-webdriver、Selenium、Capybara)的东西都不会点击或与从用户角度来看不“存在”的元素(即可见和启用)进行交互. 通常这很好,如果用户无法点击它,那么自动化工具为什么要点击它呢?这可能是“不可见”消息的来源,即 webdriver 说“嘿,我可以在 DOM 中找到这个东西,但它对用户不可见,所以你不能点击它。

我通常从 IRB 对此类页面进行故障排除,在我认为会使菜单出现的 watir-webdriver 命令中触发,然后是单击元素的命令。如果你能让它工作,那么它很可能会以脚本速度工作.

有时你需要使用 'when present' 装饰器,例如,如果某些东西会因为较早的操作而变得可见或形成,并且你不想过早地尝试与之交互。

browser.span(:text => "Customer").when_present.click 

这比@TrinitronX 的建议优雅一点,但基本上是一样的

但是,如果问题是元素在正在执行的一行代码和下一行代码之间出现和消失,那么这种方法对您没有帮助,例如,如果它消失得太快。

在这种情况下,您可能不得不求助于执行一些 javascript 来更改元素的样式以强制它可见。或者您可以尝试在元素上手动触发 onclick 事件,看看是否会导致 javascript 像您单击它一样响应。

如果没有看到站点本身,或者对其具有相同控件的示例站点,有时很难知道操作元素的最佳解决方案是什么

于 2013-02-26T21:34:03.927 回答