【问题标题】:Ruby Watir Gem, Timing Out on Form InputRuby Watir Gem,表单输入超时
【发布时间】:2017-08-05 11:47:12
【问题描述】:

我正在练习使用 Watir、Mechanize 和 Nokigiri 宝石进行网页抓取。

我的 Watir 脚本遇到了问题。我的计划是通过http://tripadvisor.com/ 获取航班价格列表。当我运行脚本时,Chrome 浏览器会正常打开,脚本会继续填写表单的第一部分、起点和终点,然后停止。这是我收到的错误消息:

This code has slept for the duration of the default timeout waiting for an Element to be present. If the test is still passing, consider using Element#exists? instead of rescuing UnknownObjectException
/home/jaffejoe/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/watir-6.2.0/lib/watir/elements/element.rb:515:in `rescue in wait_for_present': element located, but timed out after 30 seconds, waiting for true condition on #<Watir::Input: located: true; {:name=>"rt_leaveday", :tag_name=>"input"}> (Watir::Exception::UnknownObjectException)
    from /home/jaffejoe/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/watir-6.2.0/lib/watir/elements/element.rb:505:in `wait_for_present'
    from /home/jaffejoe/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/watir-6.2.0/lib/watir/elements/element.rb:522:in `wait_for_enabled'
    from /home/jaffejoe/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/watir-6.2.0/lib/watir/elements/element.rb:534:in `wait_for_writable'
    from /home/jaffejoe/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/watir-6.2.0/lib/watir/elements/element.rb:639:in `element_call'
    from /home/jaffejoe/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/watir-6.2.0/lib/watir/elements/element.rb:303:in `send_keys'
    from watir_test.rb:8:in `<main>' </

这是我的代码:

require 'watir'

browser = Watir::Browser.new

browser.goto('https://tripadvisor.com/CheapFlightsHome')
browser.input(name: 'orig').send_keys('Boston, MA - Logan International Airport (BOS)')
browser.input(name: 'dest').send_keys('Milan, Italy - All Airports (MIL)')
browser.input(name: 'rt_leaveday').send_keys('1')
browser.input(name: 'rt_leavemonth').send_keys('06/2017')
browser.input(name: 'retday').send_keys('30')
browser.input(name: 'leavemonth').send_keys('06/2017')
browser.input(value: 'Search Flights').click
puts browser.url
browser.quit

【问题讨论】:

  • 元素是否存在?
  • 当我这样做时我得到了一个真实的结果: puts browser.input(name: 'rt_leaveday').exists?

标签: ruby-on-rails ruby web-scraping nokogiri watir


【解决方案1】:

它不能在rt_leavedayrt_leavemonth 上设置值,因为它们是隐藏的输入。但是你可以执行一个脚本来点击dateselector

require 'watir'

browser = Watir::Browser.new

browser.goto('https://tripadvisor.com/CheapFlightsHome')
browser.text_field(name: 'orig').set('Boston, MA - Logan International Airport (BOS)')
browser.text_field(name: 'dest').set('Milan, Italy - All Airports (MIL)')
browser.execute_script('document.querySelector(".in_date").click()')
browser.execute_script('document.querySelector(".day_28").click()')
browser.execute_script('document.querySelector(".out_date").click()')
browser.execute_script('document.querySelector(".day_2").click()')
browser.span(id: "CHECK_FARES_BUTTON").fire_event :click
puts browser.url
browser.quit
=> https://www.tripadvisor.com/CheapFlightsSearchResults-g187849-a_airport0.BOS-a_airport1.MIL-a_cos.0-a_date0.20170328-a_date1.20170402-a_nearby0.no-a_nearby1.no-a_nonstop.no-a_pax0.a-a_travelers.1-Milan_Lombardy.html

【讨论】:

  • 起初我以为是tripadvisor出了问题,所以我在皮划艇上尝试了一些东西,但遇到了同样的问题。那时我意识到他们都在使用 jquery datepicker。然后我试图搜索如何让 Watir 使用 datepicker。谢谢你,你让我指出了解决我的问题的正确方法
  • 不用担心这是一个有趣的问题要解决 :)
  • 嘿,另一个快速问题。今天早上我又在玩这个脚本,我只是没有意识到我对 puts browser.url 得到了不同的结果。我的吐了:tripadvisor.com/CheapFlightsHome
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 2018-02-16
  • 1970-01-01
相关资源
最近更新 更多