【问题标题】:How do I read text from non visible elements with Watir (Ruby)?如何使用 Watir (Ruby) 从不可见元素中读取文本?
【发布时间】:2013-02-07 10:18:51
【问题描述】:

页面上有一个不可见的 div,但有一些我想捕获的值。在其上调用文本会返回一个空字符串。

如何在不处理原始 html 的情况下获得显示的值?无论浏览器中文本的可见性如何,我都可以强制 .text 返回我的实际值吗?

irb(main):1341:0> d.first.visible?
=> false

irb(main):1344:0> d.first.html
=> "<div class=\"day\">7</div>"

irb(main):1345:0> d.first.text
=> ""

PS:有很多很多的div(页面正在缓存响应并相应地显示它们)。我考虑更改页面中的所有 display:none 或单击以使它们可见,但如果可能的话,我希望避免这种情况。 如果不可能,更改所有显示的解决方案 none 将是首选的解决方法。

PPS:该死,我试图超载可见的? Watir::Element 类中的方法总是返回 true,但这并没有成功。

irb(main):1502:0> d.first.visible?
=> true

irb(main):1504:0> d.first.text
=> ""

【问题讨论】:

  • 您使用的是 watir-classic、watir-webdriver 还是两者都使用?虽然两种宝石的行为相同,但我认为解决方法会有所不同。
  • gem 'watir-webdriver' 使用火狐
  • 解析那个 HTML 怎么样?
  • 这就是我所做的,但是将 HTML 语法知识传播给这个 gem 的用户是不正确的。更不用说使用正则表达式的维护工作了。该库应该真的有类似 innerHtml 的东西,不应该关心可见与否,因为我可以自己查询。 text/value 函数有一些不应该存在的额外内置智能。
  • @Jeremy 我同意,也许@ŽeljkoFilipin 会知道更多.. 正则表达式? stackoverflow.com/q/1732348/1136008 使用 f.e. Nokogiri:value = Nokogiri::HTML("&lt;div class=\"day\"&gt;7&lt;/div&gt;").text # =&gt; "7"

标签: ruby watir watir-webdriver


【解决方案1】:

对于较新版本的 Watir,现在有一个 Element#text_content 方法可以为您执行以下 JavaScript。

e = d.first
e.text_content
#=> "7"

对于旧版本的 Watir(原始答案):

您可以使用 JavaScript 来获取它。

e = d.first
browser.execute_script('return arguments[0].textContent', e)
#=> "7"

请注意,这仅适用于类似 Mozilla 的浏览器。对于类似 IE 的浏览器,您需要使用 innerText。虽然如果您使用的是 watir-classic,它只是 d.first.innerText(即不需要 execute_script)。

使用属性值:

事实证明,您可以使用attribute_value 方法使其更简单。好像可以得到和javascript一样的属性值。

d.first.attribute_value('textContent')
#=> "7"

使用 inner_html

如果元素只包含文本节点(即没有元素),也可以使用inner_html

d.first.inner_html
#=> "7"

【讨论】:

  • 聪明的工作!谢谢贾斯汀。这确实成功了。这很冗长但有效。谢谢。如果没有人提出更聪明的答案,我会接受答案,但你肯定得到了我的 +1!非常感谢。
  • 如果您需要经常这样做,您可以随时将其作为方法添加到 Element 类中。
  • 这太棒了。我喜欢它。
  • @davidXYZ,仅供参考,当前版本的 Watir 现在有一个 Element#text_content 方法来执行此操作(请参阅更新的答案)。
【解决方案2】:

尝试使用execute_script 方法将“可见”的值更改为可见。 document.getElementById('id').style.visibility = 'visible' 之类的东西,假设它有一个 ID。如果没有,您可以随时要求开发人员在元素上放置一个 test-id(或者自己做)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 2012-08-29
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多