文章转于: http://www./2013/01/selenium-webdriver%E5%AD%A6%E4%B9%A0%E6%96%87%E6%A1%A3%EF%BC%88%E4%BA%8C%EF%BC%89.html
Selenium WebDriver学习文档(二)
注:本文翻译自http:///docs/03_webdriver.jsp,翻译不完全,次要部分没有翻译。文中只涉及了Java编程语言,翻译过程中稍有改动。如有什么问题需要交流,请联系我。
SeleniumWebDriver的API命令和操作
加载页面
你可能想使用WebDriver做的第一件事情是导航到一个页面。正常的方式是通过调用“get”方法:
driver.get("http://www.google.com"); |
依赖于几个因素,包括OS
/浏览器组合等,WebDriver可能或可能不会等待页面加载完全。在某些情况下,WebDriver可能在页面加载完全之前返回控制权,或者在页面刚
刚加载时,或加载中等。为保证持续健壮性,你需要使用显式和隐式等待等待元素在页面中存在 。
定位UI元素(WebElements)
在WebDriver中定位Web页面的元素,可以使用WebDriver实例,也可以使用WebElement实例。每种编程语言绑定都暴露一个
“Find Element”和“Find
Elements”的方法。前者返回WebElement对象,否则抛出一个异常。后者则返回WebElement列表。如果没有匹配查询的DOM元素,
则返回一个空列表。
查找定位元素方法,需要一个By类型的一个定位器或查询对象。By类型支持如下:
通过ID
这是最有效、优先的定位元素的方式。UI开发人员设下的常见的陷阱是,页面上的元素ID不唯一,或者页面渲染时每次都自动生成,这应该都是可以避免的。请使用html元素的class属性,而不要使用自动生成的ID。
HTML示例:
<div id="coolestWidgetEvah">...</div> |
代码示例:
WebElement element = driver.findElement(By.id("coolestWidgetEvah")); |
通过class属性
在本部分,class指的是DOM元素的类属性。在实际使用中, 通常许多DOM元素使用相同的类属性.从而定位多个元素比只定位第一个元素更有实际意义。
示例:
HTML示例:
<div class="cheese"><span>Cheddar</span></div><div class="cheese"><span>Gouda</span></div> |
代码示例:
List<WebElement> cheeses = driver.findElements(By.className("cheese")); |
按标签名称
按DOM元素的标签名称定位元素.例如:
HTML示例:
<iframe src="..."></iframe> |
代码示例:
WebElement frame = driver.findElement(By.tagName("iframe")); |
按名称属性
按DOM元素的名称属性定位元素.例如:
HTML示例:
<input name="cheese" type="text"/> |
代码示例:
WebElement cheese = driver.findElement(By.name("cheese")); |
按链接文本
定位匹配可见的文本的链接元素,例如:
HTML示例:
<a href="http://www.google.com/search?q=cheese">cheese</a> |
代码示例:
WebElement cheese = driver.findElement(By.linkText("cheese")); |
按链接文本部分匹配定位
定位部分匹配的可见文本的链接元素,例如:
HTML示例:
<a href="http://www.google.com/search?q=cheese">search for cheese</a> |
代码示例:
WebElement cheese = driver.findElement(By.partialLinkText("cheese")); |
通过CSS
顾名思义,这是一个使用CSS的元素定位战略。默认情况下,使用浏览器内建支持,所以请参考w3c
css选择器http://www./TR/CSS/#selectors来了解可用的CSS选择器。如果浏览器没有内置的CSS查询器,使
用Sizzl css查询引擎,比如,IE 6,7和FF3.0等。
要注意的是:不是所有的浏览器工作方式都一样,一些css在一些版本的浏览器工作,但是有些可能无法在另一个版本浏览器工作。
HTML示例:
<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特性支持的浏览器中,使用WebDriver的实现。需要注意不同XPTAH引擎的不同,否则会引起不期望的一些结果。
HTML示例:
<input type="text" name="example" />
<INPUT type="text" name="other" /> |
代码示例:
List<WebElement> inputs = driver.findElements(By.xpath("//input")); |
使用JavaScript
您可以执行任意的JavaScript来定位页面元素,只要javascript函数返回一个DOM元素,它会自动转换到WebElement对象。加载jQuery函数的页面上的例子如下:
WebElement element = (WebElement) ((JavascriptExecutor)driver).executeScript("return $('.cheese')[0]"); |
发现所有的紧挨着label元素的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输入域,但对于其他元素,应该怎么做呢?你可以“toggle”来切换复选框的状态,您可以使用“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”元素,依次循环它的OPTIONs选项,打印出它们的值,并依次选择选项。这不是最有效的处理SELECT元素的方式。WebDriver包括一个名为“Select”的方法,来处理下拉选择框。
代码示例:
Select select = new Select(driver.findElement(By.tagName("select")));
select.deselectAll();
select.selectByVisibleText("Edam"); |
这段代码会先反选全部的选项表,然后选“Edam”选项。
一旦你完成填写表单时,你可能要提交。方法之一是要找到“提交”按钮,然后单击它:
代码示例:
driver.findElement(By.id("submit")).click(); |
另外,WebDriver在每一个元素上有一个方便的“submit方法。如果你调用处于表单内的元素的提交方法,会唤醒DOM找到from标签的结束符号并提交表单。如果该元素是不在form表单,NoSuchElementException异常将被抛出。
代码示例:
在窗口和帧(Frame)之间移动
一些web应用程序有很多的帧和窗口。WebDriver支持在命名的窗口间移动,使用switchTo方法:
代码示例:
driver.switchTo().window("windowName"); |
自此,所有的driver的调用都针对当前窗口执行。但是你怎么获取窗口的名称?你可以试试打开该窗口的javascript或链接。
<a href="somewhere.html" target="windowName">Click here to open a new window</a> |
另外,你也可以传递一个“窗口句柄”的“switchTo().window()”方法。知道了这一点,就可以遍历所有打开的窗口,像这样:
代码示例:
for (String handle : driver.getWindowHandles()) {
driver.switchTo().window(handle);
} |
你还可以在帧间进行切换,或者进入子帧:
代码示例:
driver.switchTo().frame("frameName"); |
还可以使用点操作符和索引访问子帧,如:
代码示例:
driver.switchTo().frame("frameName.0.child"); |
该脚本会定位到名为“child”的帧,它为名为“frameName”的帧的第一个子帧。
弹出对话框:
从Selenium2.0测试版1起,就支持处理弹出对话框。当你触发一个打开弹出窗口的动作,您可以访问编写下述脚本访问该警示窗口:
代码示例:
Alert alert = driver.switchTo().alert(); |
导航:历史和位置
在前文,我们介绍了WebDriver如何使用 “get”命令(driver.get(“http://www.”)
)来加载页面。正如你所看到的一样
,WebDriver有一些较小的,服务特定任务的API接口。导航是一个非常有用的任务,可以用来加载页面,也可以用来模拟前进和后退操作。
navigate().to()和get()执行的操作是一样的,互为同义词。
代码示例:
driver.navigate().to("http://www."); |
driver.navigate().forward();
driver.navigate().back();
Cookies
在进入下一部分前,你可能有兴趣了解如何使用Cookie。首先,你需要进入cookie有效的域。如果你试图预先设定cookie,然后再与网站进行交
互,且您的主页较大/需要一段时间加载,你可以在网站上找到一个更小的页面进行加载,通常404页较小(http://
/some404page)。
定制浏览器选项:
在Firefox浏览器上,定制操作比较简单:
代码示例:
FirefoxProfile profile = new FirefoxProfile();
profile.addAdditionalPreference("general.useragent.override", "some UA string");
WebDriver driver = new FirefoxDriver(profile); |
拖拽操作
使用Action类进行拖拽的例子:
代码示例:
WebElement element = driver.findElement(By.name("source"));
WebElement target = driver.findElement(By.name("target"));
(new Actions(driver)).dragAndDrop(element, target).perform();
|