3

我对 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

4 回答 4

4

文档中的Ruby 代码(单击“ruby”按钮):

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

哪个对我有用

于 2014-07-12T21:58:11.790 回答
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 类型的成功返回是 Boolean 返回 true 或所有其他 ExpectedCondition 类型的非空返回值。

您可以根据应用程序的需要使用 ExpectedConditions 类。

隐式等待:

隐式等待是告诉 WebDriver 在尝试查找一个或多个元素时轮询 DOM 一段时间(如果它们不是立即可用的)

代码:

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

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

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

上面的代码在Java. 根据您的语言需要进行更改。

于 2013-02-05T06:34:09.567 回答
2

为了补充上述答案,这是我在 Ruby 中使用隐式和显式等待的方式。

隐式等待

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

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

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

显式等待

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

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

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

于 2013-02-06T21:59:10.533 回答
1

Ruby Selenium 绑定尚不支持 ExpectedConditions 。下面的这个片段与 ExpectedConditions.elementToBeClickable 做同样的事情——可点击只是意味着“可见”和“启用”。

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
于 2015-04-27T19:04:11.037 回答