Programming Language Preference—Selenium WebDriver

首先说明一下,这个是对官网文章的翻译,由于个人使用的是Java+Firefox+WebDriver,所以其他的东西就直接略过了。部分觉得没什么大用的也略过了,记录在这里主要是方便自己记忆。

一、Introducing WebDriver

二、How Does WebDriver ‘Drive’ the Browser Compared to Selenium-RC?
Selenium-WebDriver直接调用各个浏览器为了支持自动化所内置的功能来实现操作页面。每种浏览器所支持的功能有所不同。
Selenium-RC则采用完全不同的方式,Selenium-RC对每一种支持的浏览器都采取相同的办法,在页面加载时通过向页面“插入”javascript语句来驱动页面对象,实现自动化测试。

三、WebDriver and the Selenium-Server
如果你的浏览器和测试程序在同一台机器上,并且你只使用了WebDriver API,那么就不需要运行Selenium-Server,WebDriver可以直接驱动浏览器。
如下情况,你会需要使用到Selenium-Server:.
1、你使用了Selenium-Grid来在不同的机器(或者虚拟机)上进行分布式测试。
2、你必须使用远程主机上的特定版本的浏览器来进行测试。
3、You are not using the Java bindings (i.e. Python, C#, or Ruby) and would like to use HtmlUnit Driver

四、Setting Up a Selenium-WebDriver Project
创建Selenium-WebDriver项目最简单的办法就是使用maven(针对java程序)。

五、Introducing the Selenium-WebDriver API by Example
它没有与任何一种测试框架绑定在一起,所以可以作为一个单元测试项目项目来运行,也可以通过main函数来运行。
当你创建好Selenium-WebDriver项目后,就可以像普通的库一样的使用WebDriver API。
注意:如果你使用的是ChromeDriver, Opera Driver, Android Driver 或者 iOS Driver,你的webdriver项目还需要额外的步骤才能运行起来。

public class Selenium2Example  {
public static void main(String[] args) {
    WebDriver driver = new FirefoxDriver();
    driver.get("http://www.google.com");
    WebElement element = driver.findElement(By.name("q"));
    element.sendKeys("Cheese!");
    element.submit();
    System.out.println("Page title is: " + driver.getTitle());
    (new WebDriverWait(driver, 10)).until(new ExpectedCondition() {
        public Boolean apply(WebDriver d) {
            return d.getTitle().toLowerCase().startsWith("cheese!");
        }
    });
    System.out.println("Page title is: " + driver.getTitle());
    driver.quit();
  }
}

六、Selenium-WebDriver API Commands and Operations
1、Fetching a Page——获取页面

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

WebDriver可能会也可能不会等待页面加载完成,甚至可能在开始加载前就返回。为了确保程序正常工作,你需要进行显式的(或隐式的)等待,直到所需的元素出现在页面上。

2、Locating UI Elements (WebElements)——定位元素
所有的语言都提供“Find Element”和“Find Elements”方法。前者返回一个符合查询条件的WebElements,找不到则抛出一个异常。后者返回一个WebElement的列表,如果没有符合的元素则列表为空。
Find方法使用By定位器,可以根据ID、Class Name、Tag Name、Name、Link Text或者部分的Link Text,XPath或者css选择器来定位页面上的元素。
注意各个浏览器的实现不同,某些css选择器可能只在某些浏览器上生效。
对于不支持XPath定位的浏览器,我们提供了自己的XPath实现。使用者需要知晓各个浏览器使用的XPath引擎的区别,否则可能会产生不可预期的效果。

有一些HTML元素具有默认(隐含)的属性,比如input的默认type是text,所以可以不用显式的定义。你不能期待能匹配到这些隐含的属性。
除了以上方式,你还可以通过执行javascript代码来定位一个DOM元素,webdriver会自动将其转换为一个WebElement对象。下面是使用jQuery定位的例子:

WebElement element = (WebElement) ((JavascriptExecutor)driver).executeScript("return $('.cheese')[0]");

3、Getting text values
element.getText()可以获得元素的innerText。注意,这个方法只返回页面上可见的text。

4、User Input - Filling In Forms
填写完表单后,可以通过点击带有submit属性的按钮进行提交。WebDriver也提供了一种简便的方法,在Form里的任何元素上调用submit方法,webdriver会自动搜索表单并进行提交。如果在Form以外的元素上调用submit方法,会导致抛出NoSuchElementException异常。

5、Moving Between Windows and Frames
有一些web应用有多个frame或多个窗口。WebDriver允许使用“switchTo”方法,在有名称的窗口之间切换。

driver.switchTo().window("windowName");

一旦切换成功,所有的webdriver调用都会指向新的窗口。
如何知道新窗口的名称呢?可以通过查看跳转时的链接:

Click here to open a new window

作为另一种方案,你也可以传递一个windows句柄给“switchTo().window()”方法。你甚至可以在所有打开的窗口中进行遍历:

for (String handle : driver.getWindowHandles()) {
  driver.switchTo().window(handle);
}

你也可以在frame之间进行切换,或者进入一个frame中:

driver.switchTo().frame("frameName");

6、Popup Dialogs
当你探测到一个弹出窗口的动作时,你可以如下访问这个弹出框:

Alert alert = dirver.switchTo().alert();

使用返回的alert对象,你可以点击确定、取消、读取内容或进行输入。这个接口支持alert窗口、confirm窗口和prompts窗口。更详细的信息请查看JavaDocs。

7、Navigation: History and Location
“navigate().to()”和“get()”效果完全一样,只是后者更加的容易输入。
“navigate”接口还提供浏览器中的后退、前进功能:

driver.navigate().forward();
driver.navigate().back();

注意:这个功能依赖于具体的浏览器实现,使用不同的浏览器效果可能不同。

7、Cookies
Before we leave these next steps, you may be interested in understanding how to use cookies. First of all, you need to be on the domain that the cookie will be valid for. If you are trying to preset cookies before you start interacting with a site and your homepage is large / takes a while to load an alternative is to find a smaller page on the site (typically the 404 page is small, e.g. http://example.com/some404page).

// Go to the correct domain
driver.get("http://www.example.com");

// Now set the cookie. This one's valid for the entire domain
Cookie cookie = new Cookie("key", "value");
driver.manage().addCookie(cookie);

// And now output all the available cookies for the current URL
Set allCookies = driver.manage().getCookies();
for (Cookie loadedCookie : allCookies) {
  System.out.println(String.format("%s -> %s", loadedCookie.getName(), loadedCookie.getValue()));
}

// You can delete cookies in 3 ways
// By name
driver.manage().deleteCookieNamed("CookieName");

// By Cookie
driver.manage().deleteCookie(loadedCookie);

// Or all of them
driver.manage().deleteAllCookies();

8、Changing the User Agent
当使用Firefox Driver时很简单:

FirefoxProfile profile = new FirefoxProfile();
profile.addAdditionalPreference("general.useragent.override", "some UA string");
WebDriver driver = new FirefoxDriver(profile);

9、Drag And Drop
下面是一个使用Action来进行拖放的例子,这个例子需要浏览器开放执行拖放事件的权限:

WebElement element = driver.findElement(By.name("source"));    
WebElement target = driver.findElement(By.name("target"));

(new Actions(driver)).dragAndDrop(element, target).perform();

——Driver Specifics and Tradeoffs(权衡)——
七、Selenium-WebDriver’s Drivers
WebDriver是编写测试的关键接口的名称,有若干的实现,包括:
1、HtmlUnit Driver
是WebDriver当前最快、最轻量级的实现,基于HtmlUnit。HtmlUnit是一种基于java实现的web浏览器,这种浏览器没有GUI部分。For any language binding (other than java) the Selenium Server is required to use this driver.
优点:
速度最快、纯java实现,所以是平台无关的、支持javascript
缺点:
无法模拟其他浏览器的javascript实现

没有任何常用的浏览器使用HtmlUit所使用的JavaScript引擎(Rhino)。如果你使用HtmlUnit测试JavaScript,得到的结果会显著的与其他浏览器不同。这里说的“JavaScript”包括JavaScript和DOM。虽然DOM由W3C定义,但是不同的浏览器在DOM的具体实现上,以及如何与JavaScript交互上有一些区别。HtmlUnit支持完整的DOM实现,并且支持JavaScript,不过与其他任何浏览器都不同:它即与W3C标准不同,也与大多数浏览器不同,这就排除了HtmlUnit模拟其他浏览器的能力。
对于WebDriver,我们必须做出选择:是启用HtmlUnit对JavaScript的支持,但是冒遇到各种奇怪问题的风险,还是无视于越来越多的站点都大量使用JavaScript,却不开启HtmlUnit对JavaScript的支持。我们决定采取保守的态度,默认关闭HtmlUnitDriver对JavaScript的支持。对于每一个WebDriver和HtmlUnit的新版本,我们会重新进行评估,是否可以默认开启对JavaScript的支持。
如果你需要开启对JavaScript的支持:

HtmlUnitDriver driver = new HtmlUnitDriver(true);

这将会使HtmlUnit模拟Firefox 3.6的JavaScript实现(注意!应该并不是能很好的模拟,否则就不会默认关闭此功能了)

2、Firefox Driver
WebDriver使用Firefox的一个插件(plugin)来控制Firefox浏览器。(默认情况下)WebDriver启动Firefox浏览器时,会使用一个全新的Firefox Profile(Firefox的配置文件),只包括Selenium WebDriver.xpi插件(这样本机安装的其他插件就不会跟随浏览器启动)。另外也会有一些配置被修改(这个需要去看源码才知道修改了什么配置)。
注:现在只支持到Firefox45,更高版本的Firefox会有问题。

使用Firefox Driver的优点是在一个真实的浏览器中测试,很好的支持JavaScript,比使用IE Driver要快。
修改Firefox Profile的两种方法(略)。

当我们在Firefox Driver上开发了新的产品特性后,我们就暴露这个能力给用户。例如,我们在Linux上默认禁用了native events功能,直到我们认为此功能已经稳定。 —— 这里比较疑惑,是现在还是禁用的吗?

3、Internet Explorer Driver(略)
4、ChromeDriver(略)
5、Opera Driver(略)
6、iOS Driver(略)
7、Android Driver(略)

八、Alternative Back-Ends: Mixing WebDriver and RC Technologies(略)

九、Running Standalone Selenium Server for use with RemoteDrivers(略)

十、Additional Resources
WebDriver’s wiki:https://github.com/SeleniumHQ/selenium/wiki
Selenium User’s Group:https://groups.google.com/forum/#!forum/selenium-users

十一、Next Steps
一旦熟悉了Selenium-WebDriver的API,下一步你需要学习如何创建更加容易维护、可扩展的测试用例集,以及当被测试的应用功能特性经常变化时,如何减少测试代码的改动。
大多数Selenium专拣的建议是使用Page Object设计模式来设计你的测试代码,比如通过使用一个Page工厂。Selenium-WebDriver提供了PageFactory类来支持这种设计模式(支持Java或者C#)。
下一章会提供如何使用WebDriver的其他高级主题。如果你想了解更多关于Page Object设计模式的技术,可以阅读“Test Design Considerations”章节。这些章节,都提供了如何编写更加可维护、更加模块化的测试代码的技术。

AUT:Application Under Test

你可能感兴趣的:(我的测试生活,webdriver)