我是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"
答案 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