WebDriver: 高级用法
显式和隐式等待
等待是在执行下一步之前让自动化任务等上一定量的时间。
显示等待
一个显式等待就是在继续执行代码之前编码等待定义一个特定条件发生。最糟糕的例子是Thread.sleep(),这设置了一个明确的等待时间。WebDriver提供了一些方便的方法来帮助您的代码来等待要求的时间。WebDriverWait和ExpectedCondition的结合就是一种实现的方法。
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"));
}});
在抛出TimeoutException之前它会等待最多10秒钟,或者如果它找到了元素就在0-10秒之间返回。WebDriverWait默认每500毫秒调用ExpectedCondition直到它成功返回。ExpectedCondition类型的成功返回是布尔值true或非null的返回值。
ExpectedConditions
自动化web浏览器时有一些常用的条件。下面列出的是每个实现。Java库中恰巧有方便的方法,因此您不需要编写一个ExpectedCondition类或为它们创建自己的实用程序。
l 元素可点击 – 元素显示并且可用。
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));
ExpectedConditions 类中包含了一组与定义条件,可用于WebDriverWait
隐式等待
隐式等待告诉WebDriver一段特定的时间轮询一下DOM,来查找一个元素或者元素组,如果它们没有马上找到的话。默认设置是0。一旦设置,这个隐式等待会在WebDriver对象实例的整个生命周期起作用。
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"));
RemoteWebDriver
截屏
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);
}
}
使用FirefoxProfile
FirefoxProfile fp = new FirefoxProfile();
// set something on the profile...
DesiredCapabilities dc = DesiredCapabilities.firefox();
dc.setCapability(FirefoxDriver.PROFILE, fp);
WebDriver driver = new RemoteWebDriver(dc);
使用ChromeOptions
ChromeOptions options = new ChromeOptions();
// set some options
DesiredCapabilities dc = DesiredCapabilities.chrome();
dc.setCapability(ChromeOptions.CAPABILITY, options);
WebDriver driver = new RemoteWebDriver(dc);
高级用户交互
Actions类允许你创建一个Actions的链然后执行它们。组合的数量可能多得数不清。以下是一些您可能想要使用的常用的交互。对于完整的Action,请参看API文档Java C# Ruby Python
高级用户交互要求启用native events。这是目前支持的native events的矩阵:
platform | IE6 | IE7 | IE8 | IE9 | FF3.6 | FF10+ | Chrome stable | Chrome beta | Chrome dev | Opera | Android | iOS | |||
Windows XP | Y | Y | Y | n/a | Y | Y | Y | Y | Y | ? | Y [1] | n/a | |||
Windows 7 | n/a | n/a | Y | Y | Y | Y | Y | Y | Y | ? | Y [1] | n/a | |||
Linux (Ubuntu) | n/a | n/a | n/a | n/a | Y [2] | Y [2] | Y | Y | Y | ? | Y [1] | n/a | |||
Mac OSX | n/a | n/a | n/a | n/a | N | N | Y | Y | Y | ? | Y [1] | N | |||
Mobile Device | n/a | n/a | n/a | n/a | n/a | ? | n/a | n/a | n/a | ? | Y | N | |||
[1] |
[2] |
浏览器启动操作
使用代理
Internet Explorer
最简单和推荐的方法是在运行测试的机器中手工设置代理。如果不可能,或者你想让你的测试运行在不同的配置或者代理中,那么你需要使用以下技巧来使用一个Capabilities对象。这会暂时改变系统的代理设置,在测试结束后再改回原来的设置。
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
基本上与IE相同。它与IE一样,使用相同的配置(Windows)。在Mac中,使用System Preference->Network settings。在Linux使用System>Preferences>Network Proxy Preferences(或者/tec/environment设置http_proxy)
Firefox
Firefox用一个proxy来维护代理配置。你可以在一个profile中预先设置一个proxy,然后使用这个Profile。或者你也可以随机生成一个Profile,然后设置代理,如下例子:
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);