2013-02-05 57 views
2

后满载我很新的Ruby和硒webdriver的,所以,请帮助:)硒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" 
+0

代码是否完整?看起来至少在底部缺少一个'end'声明。 –

回答

4

您可以使用Implicit Wait and Explicit Wait等待一个特定的Web元素,直到它出现在页面的等待期间,你可以定义和也就是取决于应用

明确等待:

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

代码:

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")); 
}}); 

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

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

隐等待:

隐含的等待是为了告诉webdriver的努力,如果他们没有立即找到一种或多种元素时,轮询DOM一定量的时间

代码:

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

有一点要记住的是,一旦隐含的等待设置 - 它仍将是webdriver的对象实例的生命

欲了解更多信息使用这个链接http://seleniumhq.org/docs/04_webdriver_advanced.jsp

上面的代码为Java。根据您的语言需要更改。

+0

此答案可能适用于Java,但只需添加“根据您的语言需要更改”不会回答Ruby特定问题 – emery

+0

[visibilityOfElementLocated](https://seleniumhq.github.io/selenium/docs/api/java /org/openqa/selenium/support/ui/ExpectedConditions.html#visibilityOfElementLocated-org.openqa.selenium.By-)检查元素的高度和宽度是否大于0.它不会**等到元素被加载。 – Cani

2

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

隐等待

我通过这个选项,硒::用的webdriver这样几行初始化后:

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

只需更换“10”与你的秒数” d像浏览器一样等待页面刷新和其他类似的事件。

明确等待

有两个步骤来声明硒明确的等待。首先,你声明一个等待对象设置超时时间,然后你调用与硒的等待:: webdriver的的。直到方法。它看起来像这样,在你的榜样:

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
the docs

Ruby代码(点击 '红宝石' 按钮):

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

这对我来说

1

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 
+0

在我而言,这不会帮助,因为有在它上面的一层,所以我必须等到层消失。 – zhongxiao37

+0

如果你有信心的时间边界,其中层有望消失,硬编码的睡眠是一个有效的选项。 Selenium社区的普遍看法是应始终避免睡眠,但我认为硬编码睡眠通常只占测试执行中可避免的延迟时间的一小部分,所以如果为避免它们而需要的工程努力变得难以实施,他们没事。另外,如果您能够找到正在消失的图层,那么您应该能够在属性更改消失时等待 – emery

相关问题