Selenium用戶指南 - 第五章 WebDriver: 高級用法

From: http://blog.csdn.net/planisnothing/article/details/7252949


WebDriver:高級用法

顯式和隱含等待

等待是讓自動化任務的執行,先於繼續到下一個步驟,推移一定數量的時間。

顯式等待

顯式等待是,先於代碼的繼續執行,而定義的等待某個條件發生的代碼。最糟糕的情況是Thread.sleep(),設置條件爲一個需要等待的精確時間段。有一些提供的便利方法,可以幫助你編寫代碼僅僅等待需要的時間。WebDriverWait與ExpectedCondition的結合是一種可以完成這個目標的方式。

Java
WebDriver driver = new FirefoxDriver();
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
     .until(new ExpectedCondition<WebElement>(){
             @Override
             public WebElement apply(WebDriver d) {
                     return d.findElement(By.id("myDynamicElement"));
     }});

C#
IWebDriver driver = new FirefoxDriver();
driver.Url = "http://somedomain/url_that_delays_loading";
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IWebElement myDynamicElement = wait.Until<IWebElement>((d) =>
     {
             return d.FindElement(By.Id("someDynamicElement"));
     });

這將等待最多10秒先於拋出一個TimeoutException ,或者如果找到這個元素,則將在0 - 10秒內返回。WebDriverWait默認每隔500毫秒調用ExpectedCondition直到它成功返回。

此示例與第一個隱含等待示例在功能上等價。

隱含等待

一個隱含等待告訴WebDriver去輪詢DOM一段時間,當試圖查找不是立即可得到的一個或多個元素時。默認的設置是0。一旦設置,隱含等待將具有WebDriver對象實例的生存期。

Java
WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = driver.findElement(By.id("myDynamicElement"));

C#
WebDriver driver = new FirefoxDriver();
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
driver.Url = "http://somedomain/url_that_delays_loading";
IWebElement myDynamicElement = driver.FindElement(By.Id("someDynamicElement"));

遠程WebDriver

捕獲一個截圖

Java
import java.io.File;
import java.net.URL;

import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.Augmenter;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;

public class Testing {

     public void myTest() throws Exception {
           WebDriver driver = new RemoteWebDriver(
                 new URL("http://localhost:4444/wd/hub"), DesiredCapabilities.firefox());

           driver.get("http://www.google.com");

           // RemoteWebDriver does not implement the TakesScreenshot class
           // if the driver does have the Capabilities to take a screenshot
           // then Augmenter will add the TakesScreenshot methods to the instance
           WebDriver augmentedDriver = new Augmenter().augment(driver);
           File screenshot = ((TakesScreenshot)augmentedDriver).getScreenshotAs(OutputType.FILE);
     }
}

C#
// Add this class to your code and use this instead of RemoteWebDriver
// You will then be able to cast it to ITakesScreenshot and call GetScreenshot

public class ScreenShotRemoteWebDriver : RemoteWebDriver, ITakesScreenshot
{
     public ScreenShotRemoteWebDriver(Uri RemoteAdress, ICapabilities capabilities)
           : base(RemoteAdress, capabilities)
     {           
     }

     /// <summary>
     /// Gets a <see cref="Screenshot"/> object representing the image of the page on the screen.
     /// </summary>
     /// <returns>A <see cref="Screenshot"/> object containing the image.</returns>
     public Screenshot GetScreenshot()
     {
           // Get the screenshot as base64.
           Response screenshotResponse = this.Execute(DriverCommand.Screenshot, null);
           string base64 = screenshotResponse.Value.ToString();

           // ... and convert it.
           return new Screenshot(base64);
     }
}

// And then the usage would be:

ScreenShotRemoteWebDriver webDriver = new ScreenShotRemoteWebDriver(new Uri("http://127.0.0.1:4444/wd/hub"), DesiredCapabilities.Firefox());
// ... do stuff with webDriver
Screenshot ss = ((ITakesScreenshot)webDriver).GetScreenshot();
string screenshot = ss.AsBase64EncodedString;
byte[] screenshotAsByteArray = ss.AsByteArray;
ss.SaveAsFile(activeDir + TestSuiteName + "//" + FileNanme + imageFormat, ImageFormat.Jpeg);

高級用戶交互

Todo

瀏覽器啓動管理

Todo

包含的主題:

  - 恢復cookie

  - 改變Firefoxe配置文件

  - 運行帶插件的瀏覽器

使用代理


Internet Explorer

最容易和推薦的方式是在即將運行測試的機器上手工設置代理。如果那是不可能的或你希望測試運行帶有一個不同的配置或代理,則你可以使用Capababilities 對象,應用下面的技術。這將臨時地改變系統的代理設置,並且當完成時改變回最初的狀態。

String PROXY = "localhost:8080";
org.openqa.selenium.Proxy proxy = new org.openqa.selenium.Proxy();
proxy.setHttpProxy(PROXY)
     .setFtpProxy(PROXY)
     .setSslProxy(PROXY);
DesiredCapabilities cap = new DesiredCapabailities();
cap.setPreference(CapabilityType.PROXY, proxy);

WebDriver driver = new InternetExplorerDriver(cap);

Chrome

基本上與internet explorer是相同的。在windows,Chrome使用機器上與IE相同的配置。在Mac,Chrome使用系統首選項-〉網絡設置(System Preference -> Network settings)。在Linux(Ubuntu),Chrome使用系統-〉首選項-〉網絡代理首選項( System > Preferences > Network Proxy Preferences ),可選地在““/etc/environment”設置http_proxy。本文檔編寫時,還不知道如何編程地設置代理。


Firefox

Firefox維護代理配置在一個概要文件中。你可以預置代理在概要文件中,然後使用這個Firefox概要,或者你可以在行進中設置在概要中,正如下面的示例所顯示的。

String PROXY = "localhost:8080";

org.openqa.selenium.Proxy proxy = new org.openqa.selenium.Proxy();
proxy.setHttpProxy(PROXY)
     .setFtpProxy(PROXY)
     .setSslProxy(PROXY);
DesiredCapabilities cap = new DesiredCapabailities();
cap.setPreference(CapabilityType.PROXY, proxy);
WebDriver driver = new FirefoxDriver(cap);

Opera
Todo

HTML5
Todo

並行運行你的測試

Todo

© Copyright 2008-2012, Selenium Project. Last updated on Feb 02, 2012.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章