`
lsjlym
  • 浏览: 21356 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Selenium用户指南 - 第四章 Selenium 2.0和WebDriver[3]

 
阅读更多

命令和操作

存取一个页面

可能你想使用WebDriver做的第一件事情是导航到一个页面。要做到这点的普通方法是通过调用“get”。

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

取决于几个因素,包括OS/浏览器的组合,WebDriver可能或可能不会等待页面被装载。在某些情况下,WebDriver可能返回控制,先于页面完成,或甚至启动和装载。为了确保健壮性,你需要使用显式或隐含地等待,以等待元素存在页面上。

定位UI元素(Web元素)

用WebDriver定位元素可以使用WebDriver实例本身,或者在一个WebElement上。每一种语言绑定都暴露了一个“查找单个元素”和“查找多个元素”方法。第一个返回一个WebElement对象,否则将抛出一个异常。后一个返回一个WebElement列表,它可能返回一个空列表,如果没有DOM元素匹配这个查询。

“查找”方法带有一个定位器或称之为“By”的查询对象。“By”策略列表如下:

按id查找

这是定位一个元素最有效和首选的方法。UI开发者制造的常见陷阱是在页面上没有唯一的id或自动生成的id,两者都应该避免。在一个html元素上的class属性,比自动生成的id属性更适当。

下面是如何找到一个看起来像这样的元素的示例:

<div id="coolestWidgetEvah">...</div>
WebElement element = driver.findElement(By.id("coolestWidgetEvah"));

按类(class)名称查找

此处的“Class”意指DOM元素的class属性。时常在实际使用中,有许多DOM元素带有相同的class,因此查找多个元素比查找第一个元素成为更实际的选项。

如何查找一个看起来像这样的元素的示例:

<div class="cheese"><span>Cheddar</span></div><div class="cheese"><span>Gouda</span></div>
List<WebElement> cheeses = driver.findElements(By.className("cheese"));

按标记(tag)名称查找

元素的DOM标记名称

如何查找一个看起来像这样的元素的示例:

<iframe src="..."></iframe>
WebElement frame = driver.findElement(By.tagName("iframe"));

按名称(name)查找

用匹配的name属性找到输入元素

如何查找一个看起来像这样的元素的示例:

<input name="cheese" type="text"/>
WebElement cheese = driver.findElement(By.name("cheese"));

按链接文本查找

用可见的文本查找超链接元素

如何查找一个看起来像这样的元素的示例:

<a href="http://www.google.com/search?q=cheese">cheese</a>>
WebElement cheese = driver.findElement(By.linkText("cheese"));

按部分链接文本查找

用部分可见的文本查找超链接元素

如何查找一个看起来像这样的元素的示例:

<a href="http://www.google.com/search?q=cheese">search for cheese</a>>
WebElement cheese = driver.findElement(By.partialLinkText("cheese"));

按css样式查找

如同名称所隐含的,这是一个按css的定位器策略。缺省地使用本地浏览器支持,请参考W3C的css选择器,以获得一列常用可得到的css选择器列表。如果浏览器没有对css选择器本地的支持,则使用Sizzle。IE6,7和Firefox 3.0目前使用Sizzle作为css查询引擎。

小心,不是所有浏览器都是一样的,某些css可能工作在一个版本,但在另一个版本不工作。

下面是查找cheese的示例

<div id="food"><span class="dairy">milk</span><span class="dairy aged">cheese</span></div>
WebElement cheese = driver.findElement(By.cssSelector("#food span.dairy.aged"));

按XPath查找

在高级别,只要可能,WebDriver使用浏览器内置的XPath能力。在那些没有内置XPath支持的浏览器,我们提供了我们自己的实现。这可能回导致某些未预期得行为,除非你知道各种各样的XPath引擎之间的差异。

Driver Tag and Attribute Name ;Attribute Values Native XPath Support
HtmlUnit Driver Lower-cased As they appear in the HTML Yes
Internet Explorer Driver Lower-cased As they appear in the HTML No
Firefox Driver Case insensitive As they appear in the HTML Yes

这有一点抽象,看看下面的HTML片段:

<input type="text" name="example" />
<INPUT type="text" name="other" />
List<WebElement> inputs = driver.findElements(By.xpath("//input"));

下面是找到的匹配的数量

XPath expression HtmlUnit Driver Firefox Driver Internet Explorer Driver
//input 1 (“example”) 2 2
//INPUT 0 2 0

有时HTML元素的属性不需要显式的声明,它们有缺省的已知值。例如,“input”标记不需要“type”属性,因为缺省为“text”。经验法则是使用WebDriver的XPath时,不应预期能够匹配这些隐含的属性。

使用Javascript

你可以执行任何Javascript,以找到一个元素,只要你找到一个DOM元素,它将自动转换为WebElement对象。

简单的示例在一个装载了jQuery的页面上:

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

查找页面上的每个标签所指的input元素:

List<WebElement> labels = driver.findElements(By.tagName("label"));
List<WebElement> inputs = (List<WebElement>) ((JavascriptExecutor)driver).executeScript(
"var labels = arguments[0], inputs = []; for (var i=0; i < labels.length; i++){" +
"inputs.push(document.getElementById(labels[i].getAttribute('for'))); } return inputs;", labels);

用户输入 - 填充窗体

我们已经看到如何键入文本到一个textarea或text域,但其他的元素哪?你可以“切换”复选框的状态,你可以使用“click”去设置类似于选项(OPTION)标记的选择。处理SELECT标记也不是太糟糕:

WebElement select = driver.findElement(By.tagName("select"));
List<WebElement> allOptions = select.findElements(By.tagName("option"));
for (WebElement option : allOptions) {
System.out.println(String.format("Value is: %s", option.getAttribute("value")));
option.click();
}

这将找到页面上的第一个“SELECT”元素,并依次循环通过每一个选项(OPTION),打印出它们的值,然后依次选择每一个。正如你注意到的,这不是处理SELECT元素最有效的方式。WebDriver提供许多类,包括一个称之为"Select"的,提供了实用的方法与它们交互。

Select select = new Select(driver.findElement(By.tagName("select")));
select.deselectAll();
select.selectByVisibleText("Edam");

这将取消页面上的第一个SELECT元素选择所有的选项,然后选择带有显示文本“Edam”的选项。

一旦,你完成了窗体的填充,你可能希望提交它。完成这个的一个方法是查找“submit”按钮然后“click”它。

driver.findElement(By.id("submit")).click();

替代地,WebDriver在每个元素上有替代的方法“submit”。如果你在一个窗体内的元素上调用它,WebDriver会走查DOM直到找到这个包围的窗体,然后在其上调用提交。如果一个元素没有在窗体内,则抛出NoSuchElementException。

element.submit();

在window和frame之间移动

有些Web应用程序有许多frame和多个window。WebDriver支持使用“switch”方法在命名的window之间移动:

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

所有对驱动器的调用,现在将被解释作定向到特殊的window。但你如何获得window的名称?可以看看打开它的Javascript或链接:

<a href="somewhere.html" target="windowName">Click here to open a new window</a>

替代地,你可以传递一个“window句柄”给 “switchTo().window()” 方法,知道这个,就可以像这样遍历每一个打开的窗口:


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

你也可以从一个frame转到到另一个(或到iframe):

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

可以访问子frame,通过使用.(dot)分隔路径,你也可以指定frame按它的索引。 那就是:

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

这将到名称为“frameName”的frame的第一个子frame的名称为“child”的frame。从top(根窗口)开始评估所有的frame。

弹出对话框

从Selenium 2.0 beta 1 开始,有内置的对弹出对话框的处理支持。在你触发一个动作打开一个弹出对话框后,你可以访问这个对话框用下面的方式:


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

这将返回目前打开的alert对象。用这个对象你现在可以接受,关闭,读取它的内容,甚至键入一个提示框的内容。这个接口在alert,confirm和prompt对话框上工作的同样好。参考JavaDoc以获取更多的信息。


导航:历史和位置

在较早,我们涉及了导航到一个页面使用“get”命令(driver.get("http://www.example.com"))。正如你看到的,WebDriver有大量的较小的,聚焦于任务的接口,而导航是一个有用的任务。因为装载一个页面是一个如此基本的要求,完成这个任务的方法在主WebDriver接口,但它仅仅是一个下面方法的同义词:


driver.navigate().to("http://www.example.com");

重申: “navigate().to()” 和“get()” 做完全相同的事情。只是一个比另一个更容易的键入。

“navigate” 接口也暴露在你的浏览器历史中前后移动的能力:

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

请注意这个功能完全依赖于潜在的浏览器。如果你使用这个功能在不同的浏览器,出现一些未预期的事情是完全可能的。

Cookies

在我们移动到下个步骤前,你可能对理解如何使用cookies感兴趣。首先,你必须在cookie有效的域。如果你试图预置cookies,先于你开始与一个站点的交互,而且你的主页很大,需要花费一些时间装载。

// 跳转到正确的域

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

// 现在设置cookie,这个对整个域是有效的。

Cookie cookie = new Cookie("key", "value");
driver.manage().addCookie(cookie);

// 现在输出当前的URL,所有可得到得cookie

Set<Cookie> allCookies = driver.manage().getCookies();
for (Cookie loadedCookie : allCookies) {
System.out.println(String.format("%s -> %s", loadedCookie.getName(), loadedCookie.getValue()));
}

可以用三种方法删除cookie

// 按名称

driver.manage().deleteCookieNamed("CookieName");

// 按Cookie

driver.manage().deleteCookie(loadedCookie);

// 或所有

driver.manage().deleteAllCookies();

改变用户代理

使用Firefox驱动器是容易的:

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

拖放

这是一个使用Actions类执行拖放操作的示例。需要使能内置事件。

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

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

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics