【问题标题】:Watir: Retrieve all dynamic HTML elements that match an attribute?Watir:检索与属性匹配的所有动态 HTML 元素?
【发布时间】:2018-12-01 01:40:32
【问题描述】:

我正在尝试使用 Watir 抓取动态内容,但我被卡住了。

基本上,我知道我可以使用

browser.element(css: ".some_class").wait_until_present

为了仅在加载“some_class”时进行抓取。

问题是它只给了我第一个具有此类名称的元素,而我想要所有这些元素。


我也知道我可以使用

browser.spans(css: ".some_class")

为了收集所有具有此名称的类,问题是我不能将它与“wait_until_present”结合起来(它给了我一个错误)。并且他自己的 span 不起作用,因为内容尚未加载,页面正在使用 javascript


有没有办法将两者结合起来?这意味着等待加载 class_name 并选择与该类名匹配的所有元素,而不仅仅是第一个?

我已经被困了好多年了……

非常感谢您的帮助

【问题讨论】:

  • 你能通过调试模式试试这个问题吗?单击此处的按钮后停止一次并留出一些时间间隔并继续执行其余的语句,让我们看看它是否返回所有值。

标签: ruby web-scraping watir


【解决方案1】:

目前在 Watir 中没有任何东西可以等待元素集合(尽管我最近一直在考虑添加一些东西)。目前,您只需手动等待元素出现,然后获取集合。

最简单的方法是调用你的两条线:

browser.element(css: ".some_class").wait_until_present
browser.spans(css: ".some_class")

如果你想单线,你可以使用#tap

browser.spans(css: ".some_class").tap { |c| c[0].wait_until_present }
#=> Watir::SpanCollection

请注意,如果您只是检查类名,您可能希望避免编写 CSS 选择器。没有它不仅更容易阅读,而且性能也不会那么好。

browser.spans(class: "some_class").tap { |c| c[0].wait_until_present }

【讨论】:

  • 我们永远不能等待集合,因为集合中有多少元素将在加载后确定。所以这是不可能的。
  • @Rajagopalan,正确的视角没有什么是不可能的。 Watir 可以知道应该存在多少元素——如果用户告诉它的话。与 Capybara 类似,Watir 可以实现类似browser.spans(minimum: 3) 的东西,它会等到至少有 3 个跨度。
  • 用户在加载之前不知道有多少元素,那是没有意义的。
  • 非常感谢您的回答!不幸的是,我已经尝试过了,但它不起作用。跨度给了我一个集合,但是当我对其进行迭代时,它什么也没给我。我试图选择集合的最后一个人,它说“位于:false”,这让我认为它没有等待页面加载才能使用跨度。
  • @JustinKo 我认为这就像将#any? 别名为#present? 然后包括Waitable,@Jessicascn 你能在Github 上提出这个功能请求的问题吗? github.com/watir/watir/issues/new。此外,集合现在是延迟加载的,这意味着在您尝试使用它之前什么都找不到。只是做my_collection.last 不会尝试定位元素。 my_collection.last.exists? 将定位元素(或点击或attribute_value,或send_keys等)
猜你喜欢
  • 2013-06-10
  • 1970-01-01
  • 1970-01-01
  • 2019-08-12
  • 1970-01-01
  • 2020-03-18
  • 1970-01-01
  • 2021-06-01
  • 2016-07-02
相关资源
最近更新 更多