Selenium-Webdriver Ruby - >单击后如何等待图像完全加载

时间:2013-02-05 04:16:13

标签: ruby selenium-webdriver

我是Ruby和Selenium-Webdriver的新手,所以请帮助:)

我正在尝试打开电子邮件广告系列,发送到我的收件箱,其中包含图片并在Firefox中截取屏幕截图。但我不能让它等到图像完全加载。点击“显示图像”后,屏幕截图已经拍摄,但当时未加载图像。在显示所有图像后,如何在稍后暂停脚本并截取屏幕截图?

请帮助:(

贝娄是我的剧本:

enter code here

require 'selenium-webdriver'

browser = Selenium::WebDriver.for :firefox

#==========================================================================================

wait = browser.manage.timeouts.implicit_wait = 15
#==========================================================================================
url = 'https://login.yahoo.com/config/login_verify2?.intl=us&.src=ym'
# Open browser (firefox)
browser.navigate.to url
browser.find_element(:id, 'username').send_keys "some yahoo id"
browser.find_element(:id, 'passwd').send_key "some password"
browser.find_element(:id, ".save").click
browser.find_element(:id, "inbox-label").click
browser.find_element(:xpath, "//div[@class='subj']").click
browser.find_element(:xpath, "//a[@title='Display blocked images']").click

result_page_title = browser.find_element(:tag_name, 'title')
    puts "Title of the page: \t\t: #{result_page_title.text}"
    browser.save_screenshot "1.jpg"

4 个答案:

答案 0 :(得分:4)

您可以使用Implicit Wait and Explicit Wait等待特定的Web元素,直到它出现在页面中。您可以定义的等待时间取决于应用程序。

明确等待

显式等待是您定义的代码,用于在进一步执行代码之前等待某个条件发生。如果达到的条件将终止等待并继续进一步的步骤。

代码:

 WebDriverWait wait = new WebDriverWait(driver,30);
 wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(strEdit)));

 WebElement myDynamicElement = (new WebDriverWait(driver, 30))
 .until(new ExpectedCondition<WebElement>(){
@Override
public WebElement apply(WebDriver d) {
    return d.findElement(By.id("myDynamicElement"));
}});

在抛出TimeoutException之前等待最多30秒,或者如果它发现元素将在0-30秒内返回它。默认情况下,WebDriverWait每500毫秒调用一次ExpectedCondition,直到它成功返回。成功返回的是ExpectedCondition类型是布尔返回true或非null返回值,用于所有其他ExpectedCondition类型。

您可以根据需要使用ExpectedConditions类。

隐含等待

隐式等待是告诉WebDriver在尝试查找一个或多个元素时,如果它们不能立即可用,则会在一定时间内轮询DOM

代码:

 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

要记住的一件事是,一旦设置了隐式等待 - 它将保留WebDriver对象实例的生命周期

有关详细信息,请使用此链接http://seleniumhq.org/docs/04_webdriver_advanced.jsp

以上代码位于Java。根据您的语言需要进行更改。

答案 1 :(得分:2)

要添加上面的答案,这里是我在Ruby中使用隐式和显式等待的方法。

隐含等待

在使用以下几行初始化之后,我将此选项传递给Selenium :: WebDriver:

browser = Selenium::WebDriver.for :firefox
browser.manage.timeouts.implicit_wait = 10

只需将“10”替换为您希望浏览器等待页面刷新和其他此类事件的秒数。

明确等待

在Selenium中声明显式等待有两个步骤。首先通过声明一个等待对象来设置超时时间,然后使用Selenium :: Webdriver的.until方法调用wait。在你的例子中,它看起来像这样:

wait = Selenium::WebDriver::Wait.new(:timeout => 10)
wait.until { browser.find_element(:xpath, "//path/to/picture").displayed? }

这将告诉Webdriver最多等待10秒钟才能显示图片元素。你也可以使用.enabled?如果您正在等待的元素是一个交互元素 - 当您使用基于Ajax的输入表单时,这尤其有用。

您还可以在脚本开头声明一个显式等待期,然后在需要时再次引用该对象。除非您想设置新的超时,否则无需重新声明它。就个人而言,我喜欢将wait.until保存在一个方法中,因为我知道我将重复引用它。类似的东西:

def wait_for_element_present( how_long=5, how, what )
  wait_for_it = Selenium::WebDriver::Wait.new(:timeout => how_long )
  wait_for_it.until { @browser.find_element(how, what) }
end

(我发现将浏览器声明为实例变量更容易,因此您不必每次都将它传递给方法,但是这部分取决于您,我猜?)

答案 2 :(得分:2)

来自the docs的Ruby代码(点击&#39; ruby​​&#39;按钮):

wait = Selenium::WebDriver::Wait.new(:timeout => 10) # seconds
begin
  element = wait.until { driver.find_element(:id => "some-dynamic-element") }
ensure
  driver.quit
end

哪个适合我?

答案 3 :(得分:1)

Ruby Selenium bindings尚未支持ExpectedConditions。下面的这个片段与ExpectedConditions.elementToBeClickable做同样的事情 - 可点击只是意味着&#34;可见&#34;和&#34;启用&#34;。

element = wait_for_clickable_element(:xpath => xpath)

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

  element = wait.until { @driver.find_element(locator) }
  wait.until { element.displayed? }
  wait.until { element.enabled? }

  return element
end