分享

Selenium WebDriver学习文档(二)

 漫漫长夜有你 2013-08-15
文章转于:
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引擎的不同,否则会引起不期望的一些结果。

Driver 标签和属性名称 属性值 内置XPath支持
HtmlUnit Driver 小写 如HTML所展示 Yes
Internet Explorer Driver 小写 如HTML所展示 No
Firefox Driver 大小写不敏感 如HTML所展示 Yes

 

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异常将被抛出。
代码示例:

element.submit();

在窗口和帧(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();

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多