当前位置: 首页 > 知识库问答 >
问题:

Ruby Selenium Webdriver-睡眠而不是等待

慕逸仙
2023-03-14

我正在使用Ruby和selenium webdriver gem创建一个web爬行/抓取脚本。我几乎完成了这个项目,但在某个点上卡住了,我正在抓取的站点用于对服务器的页面调用并显示一个字符串,问题是它显示了50%的时间,而不是100%。所以我需要循环get函数,直到它显示字符串。

我使用了隐式

#throws exception after timout

wait = Selenium::WebDriver::Wait.new(:timeout => 10) 
wait.until { driver.find_element(:id, 'message').displayed? }

我需要的是

#continues to next block of code after timout

sleep = Selenium::WebDriver::Sleep.new(:timeout => 10) 
sleep.until { driver.find_element(:id, 'message').displayed? } do
   ##RUN CODE TO CALL THE STRING AGAIN##
end

好吧,我可以使用正常的睡眠10并且工作正常,但如果调用首先返回字符串,这是浪费时间

#normal Sleep

sleep 10
driver.find_element(:id, 'message').displayed? 

共有3个答案

笪烨
2023-03-14

我的解决方案

虽然您的解决方案确实有效,但我想提出另一种解决方案:

def element_is_displayed?(by, value)

  # Can I find any elements on the page matching what I've been given?
  if driver.find_elements({by => value})[0] != nil
    # Got a match, is it displayed?
    driver.find_element({by => value}).displayed?
  else
    # No matches found
    false 
  end
end

wait = Selenium::WebDriver::Wait.new(:timeout => 10)
wait.until { element_is_displayed?("id", "message") }

解释

是否显示元素 函数将尝试在给定的值中找到至少一个匹配项,如果找不到匹配项,或元素未显示,它将在<代码>等待中执行循环。直到

由于此函数始终返回布尔值,因此适合在selenium wait中使用。直到方法,该方法仅在满足超时或返回真实值时返回。

另一个优点是该函数是可重用的:保持该函数尽可能可配置,您仍然能够通过任何selenium本机元素(css、id、xpath等)找到元素。

这还意味着,如果该元素由于某种原因根本不存在于页面上(例如,浏览器没有加载该页面),那么该函数将不会不断循环(看起来您的函数可能会这样做几个小时,因为它将挽救“未找到元素”错误并再次运行)。

希望这有帮助。

文嘉禧
2023-03-14

显然是我自己解决的;)谢谢你们的帮助,在selenium中没有“睡眠。直到”这样的东西。解决方案是处理例外情况并相应地采取行动。

wait = Selenium::WebDriver::Wait.new(:timeout => 10)

def run 
  ##code to retrieve message

  begin
    wait.until { driver.find_element(:id, 'message').displayed? } #check if message received
  rescue
    ##this block get's executed if there is any kind of exception error
    run
  end

end
申思远
2023-03-14
# Method will either interrupt waiting when condition is truthy,
# or it will throw Timeout error after N seconds
def wait_until(timeout = DEFAULT_WAIT_TIME)
  Timeout.timeout(timeout) do
    sleep(0.1) until value = yield
    value
  end
end

# usage
wait_until(10) { driver.find_element(:id, 'message').displayed? }
 类似资料:
  • 这里的要点是了解实现等待循环的更有效的解决方案,该循环在每次迭代时轮询条件。通过高效,我的意思是“有效的CPU调度”。 我知道代码中使用的等待条件不是“wakeOne”/“wakeAll”指令中使用的“真正的等待条件”,但我想知道对CPU来说,使用假等待条件是否比睡眠更有效。 这里有2个代码片段,它们做同样的事情:等待某些事情发生。这段代码用于工作线程池。因此,当一个线程等待时,其他线程(或其他一

  • 因此,我理解流畅而明确的等待,但过去我永远无法让隐含的语句起作用。我设法不使用显式词来处理它们,但我随后设计了一个相当简单的测试,但它只适用于线程。睡觉,我绝对讨厌这种方法,并试图不惜一切代价避免它。所以我再次尝试隐式等待函数。。。失败 下面的代码带有线程。睡眠按计划进行,非常好 但当我最终尝试使用隐式(如下面)时,它就不起作用了。我确保在声明驱动程序之后立即声明一次(在本例中为)。考试会在课前的

  • 我正在编写一个基于await/sleep范式的网络绑定应用程序。 我更喜欢这样一个答案,不创建任何额外的线程

  • 曾经,小法师还在魔法学院做魔法学徒的时候,经历过两次 鬼压床 第一次据现在已经四年了,当时的小法师甚至不知道这叫 “鬼压床”,只是完全不知所措,把此事定义为 “灵异事件” 让我们回到四年前,(括号中为运用《梦的解释》理论的分析): 当时小法师中午 shopping 回来,去睡了会午觉 又加上他在感冒,十分不舒服,小法师就用继续用催眠疗法 之前已经提过,小法师用此法后,就没做梦的烦恼,并且快两年了也

  • 自动睡眠 于一定时间内没有操作后,会自动进入睡眠模式以节省电力。 关 不自动进入睡眠模式 5分后 5分钟以后进入睡眠模式 10分后 10分钟以后进入睡眠模式 15分后 15分钟以后进入睡眠模式 提示 于进行以下操作时,自动睡眠机能可能会暂时失效。 连接交流电转换器时 玩游戏时 播放影像时 播放音乐时 播放幻灯片秀时 使用USB连接线与外接装置连接,启用USB模式时 聆听网上电台时* *  部份网上

  • 问题内容: 例如,有没有一种我可以执行的方法 然后在需要时“唤醒”睡眠的goroutine? 我看到里面有一个,但是我无法调用它。有什么想法吗? 问题答案: 没有办法中断,但是,您可以使用和语句来获取所需的功能。 一个简单的例子来展示基本思想: http://play.golang.org/p/7uKfItZbKG 在此示例中,我们生成了一个信令goroutine来告知main停止暂停。主要是在两