|
2#
楼主 |
发表于 2018-5-4 16:23:38
|
只看该作者
获取一个页面####
访问一个页面或许是使用 WebDriver 时你第一件想要做的事情。最常见的是调用 “get” 方法:
driver.get("http://www.google.com");
包括操作系统和浏览器在内的多种因素影响,WebDriver 可能会也可能不会等待页面加载。在某些情况下,
WebDriver可能在页面加载完毕前就返回控制了,甚至是开始加载之前。为了确保健壮性,你需要使用 E
xplicit and Implicit Waits 等到页面元素可用。
查找 UI 元素(web 元素)####
WebDriver 实例可以查找 UI 元素。每种语言实现都暴露了 “查找单个元素” 和 “查找所有元素” 的方法。
第一个方法如果找到则返回该元素,如果没找到则抛出异常。第二种如果找到则返回一个包含所有元素
的列表,如果没找到则返回一个空数组。
“查找” 方法使用了一个定位器或者一个叫 “By” 的查询对象。“By” 支持的元素查找策略如下:
By id
这是最高效也是首选的方法用于查找一个元素。UI 开发人员常犯的错误是,要么没有指定 id,要么自动
生成随机 id,这两种情况都应避免。及时是使用 class 也比使用自动生成随机 id 要好的多。
HTML:
<div id="coolestWidgetEvah">...</div>
Java:
WebElement element = driver.findElement(By.id("coolestWidgetEvah"));
By Class Name
"class" 是 DOM 元素上的一个属性。在实践中,通常是多个 DOM 元素有同样的 class 名,所以通常用它
来查找多个元素。
HTML:
<div class="cheese"><span>Cheddar</span></div><div class="cheese"><span>Gouda</span></div>
Java:
List<WebElement> cheeses = driver.findElements(By.className("cheese"));
By Tag Name
根据元素标签名查找。
HTML:
<iframe src="..."></iframe>
Java:
WebElement frame = driver.findElement(By.tagName("iframe"));
By Name
查找 name 属性匹配的表单元素。
HTML:
<input name="cheese" type="text"/>
Java:
WebElement cheese = driver.findElement(By.name("cheese"));
By Link Text
查找链接文字匹配的链接元素。
HTML:
<a href="http://www.google.com/search?q=cheese">cheese</a>>
Java:
WebElement cheese = driver.findElement(By.linkText("cheese"));
By Partial Link Text
查找链接文字部分匹配的链接元素。
HTML:
<a href="http://www.google.com/search?q=cheese">search for cheese</a>>
Java:
WebElement cheese = driver.findElement(By.partialLinkText("cheese"));
By CSS
正如名字所表明的,它通过 css 来定位元素。默认使用浏览器本地支持的选择器,可参考 w3c 的 css 选择
器。如果浏览器默认不支持 css 查询,则使用 Sizzle。ie6、7 和 ff3.0 都使用了 Sizzle。
注意使用 css 选择器不能保证在所有浏览器里都表现一样,有些在某些浏览器里工作良好,在另一些浏览
器里可能无法工作。
HTML:
<div id="food"><span class="dairy">milk</span><span class="dairy aged">cheese</span></div>
Java:
WebElement cheese = driver.findElement(By.cssSelector("#food span.dairy.aged"));
By XPATH
此处略过不译
用户输入 - 填充表单####
我们已经了解了怎么在输入框或者文本框中输入文字,但是如何操作其他的表单元素呢?你可以切换多选
框的选中状态,你可以通过“点击”以选中一个 select 的选项。操作 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,打印其值,再依次进行点击操作
以选中这个 option。这并不是处理 select 元素最高效的方式。WebDriver 有一个叫 “Select” 的类,这个类
提供了很多有用的方法用于 select 元素进行交互。
Select select = new Select(driver.findElement(By.tagName("select")));
select.deselectAll();
select.selectByVisibleText("Edam");```
上述代码取消页面上第一个 select 元素的所有 option 的选中状态,然后选中字面值为 “Edam” 的 option。
如果你已经完成表单填充,你可能希望提交它,你只要找到 “submit” 按钮然后点击它即可。
`driver.findElement(By.id("submit")).click();`
或者,你可以调用 WebDriver 为每个元素提供的 “submit” 方法。如果你对一个 form 元素调用该方法,
WebDriver 将调用这个 form 的 submit 方法。如果这个元素不是一个 form,将抛出一个异常。
`element.submit();`
####在窗口和帧(frames)之间切换####
有些 web 应用含有多个帧或者窗口。WebDriver 支持通过使用 “switchTo” 方法在多个帧或者窗口之间切换。
`driver.switchTo().window("windowName");`
所有 dirver 上的方法调用均被解析为指向这个特定的窗口。但是我们如何知道这个窗口的名字?来看一个
打开窗口的链接:
`<a href="somewhere.html" target="windowName">Click here to open a new window</a>`
你可以将 “window handle” 传递给 “switchTo().window()” 方法。因此,你可以通过如下方法遍历所有打
开的窗口:
`for (String handle : driver.getWindowHandles()) { driver.switchTo().window(handle); }`
你也可以切换到指定帧:
`driver.switchTo().frame("frameName");`
你可以通过点分隔符来访问子帧,也可以通过索引号指定它,例如:
`driver.switchTo().frame("frameName.0.child");`
该方法将查找到名为 “frameName” 的帧的第一个子帧的名为 “child” 的子帧。所有帧的计算都会从 **to
p** 开始。
####弹出框####
由 Selenium 2.0 beta 1 开始,就内置了对弹出框的处理。如果你触发了一个弹出框,你可以通过如下方
访问到它:
`Alert alert = driver.switchTo().alert();`
该方法将返回目前被打开的弹出框。通过这个返回对象,你可以访问、关闭、读取它的内容甚至在 pro
mpt 中输入一些内容。这个接口可以胜任 alerts,comfirms 和 prompts 的处理。
####导航:历史记录和位置####
更早的时候,我们通过 “get” 方法来访问一个页面 (driver.get("[http://www.example.com"))。正如你
所见,WebDriver](http://www.example.com%22%29%29.xn--%2Cwebdriver-cl5px68gk0xsl2a2g9g
/) 有一些更小巧的、聚焦任务的接口,而 navigation 就是其中一个非常有用的任务。因为加载页面是
一个非常基本的需求,实现该功能的方法取决于 WebDriver 暴露的接口。它等同于如下代码:
`driver.navigate().to("http://www.example.com");`
重申一下: “navigate().to()” 和 “get()” 做的事情是完全一样的。只是前者更易用。
“navigate” 接口暴露了访问浏览器历史记录的接口:
`driver.navigate().forward();
driver.navigate().back();`
需要注意的是,该功能的表现完全依赖于你所使用的浏览器。如果你习惯了一种浏览器,那么在另一种
浏览器中使用它时,完全可能发生一些意外的事情。
####Cookies####
在我们继续介绍更多内容之前,还有必要介绍一下如何操作 cookie。首先,你必须在 cookie 所在的域。
如果你希望在加载一个大页面之前重设 cookie,你可以先访问站点中一个较小的页面,典型的是 404 页
面 ([http://example.com/some404page)。](http://example.com/some404page)%E3%80%82)
// 进到正确的域
driver.get("http://www.example.com");
// 设置 cookie,这个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()));
}
// 你可以通过3中方式删除 cookie
// By name
driver.manage().deleteCookieNamed("CookieName");
// By Cookie
driver.manage().deleteCookie(loadedCookie);
// Or all of them
driver.manage().deleteAllCookies();
####改变 UA####
当使用 Firefox Driver 的时候这很容易:
`
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();
|
|