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

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

您可以使用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(){ @Override public WebElement apply(WebDriver d) { return d.findElement(By.id("myDynamicElement")); }}); 

在抛出TimeoutException之前等待最多30秒,或者如果它发现元素将在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 。 根据您的语言需要进行更改

要添加到上面的答案,这里是我在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 

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

来自文档的 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 

哪个适合我

Ruby Selenium绑定中尚不支持ExpectedConditions。 下面的代码片段与ExpectedConditions.elementToBeClickable完全相同 – clickable只表示“可见”和“已启用”。

 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