Selenium webdriver的高级用法

来源:互联网 发布:rotor gene q软件 编辑:程序博客网 时间:2024/06/05 05:31

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文档JavaC# 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]

(1,2,3,4) Using the emulator

 

[2]

(1,2) With explicitly enabling native events

浏览器启动操作

使用代理

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

 

原创粉丝点击