7.5弹出框
Selenium2.0 beta1版本,我们提供方法获取弹出框。在你触发弹出框的操作后,你可以用一下方法进入弹出框:
Alert alert = driver.switchTo().alert();
以上方法将会返回当前当前打开的alert对象,你可以对这个对象进行任何可操作:点击取消,点击确定,关闭窗口,获取alert的文本内容等。这个接口在alerts、confirms、prompts对象上都有很好的应用,具体请参见API文档。
7.6Navigation:浏览器本地历史记录
前文中,我们使用get方法来获取网页(driver.get("http://www.example.com"))。正如你看到的,WebDriver有不少轻量级的功能聚焦的接口,Navigation是这样一个。正因为加载网页是一个再普通不过的需求,这个方法存在于Driver类下面,但是用法很简单:
driver.navigate().to("http://www.example.com");
重申一下,"navigate().to()"和"get()"做的是同样的事情,只不过其中一个更适合打印。
Navigate接口还提供方法可以在浏览器历史记录中前后翻页。
driver.navigate().forward();
driver.navigate().back();
请注意,以上功能完全取决于底层的浏览器。如果你习惯跨浏览器操作,当你使用这些接口时可能会出现意想不到的的异常。
7.7Cookies
在我们开始下一步的讲解之前,你可能对WebDriver如何操作本地Cookies很感兴趣。首先,你必须处于当前Cookie的作用域。如果你在打开一个网页之前尝试预置Cookie,而且你的主页大到需要很长一段时间来加载,这时候你需要找一个小点的网页来替代,比如HTTP 404网页(http://example.com/some404page)。
// 打开Cookie作用的网站
driver.get("http://www.example.com");
// 设置全局Cookie
Cookie cookie = new Cookie("key", "value");
driver.manage().addCookie(cookie);
// 输出当前网页所有可用的Cookie
Set allCookies = driver.manage().getCookies();
for (Cookie loadedCookie : allCookies) {
System.out.println(String.format("%s -> %s", loadedCookie.getName(), loadedCookie.getValue()));
}
// 你又三种方法删除Cookie
// By name
driver.manage().deleteCookieNamed("CookieName");
// By Cookie
driver.manage().deleteCookie(loadedCookie);
// Or all of them
driver.manage().deleteAllCookies();
7.8 修改用户代理服务器
对于FireFox来说很简单:
FirefoxProfile profile = new FirefoxProfile();
profile.addAdditionalPreference("general.useragent.override", "some UA string");
WebDriver driver = new FirefoxDriver(profile);
7.9 拖拽Web元素
下面是一个拖拽Web页面元素的例子,前提是本地事件必须可用。
WebElement element = driver.findElement(By.name("source"));
WebElement target = driver.findElement(By.name("target"));
(new Actions(driver)).dragAndDrop(element, target).perform();
8 各种Driver的特性以及如何选择合适Driver
翻译中
9 向前兼容:融合WebDriver和Selenium-RC
翻译中
10 为远程WebDriver单独启动Selenium Server
翻译中
译者注:
1、原文链接:http://www.seleniumhq.org/docs/03_webdriver.jsp。
2、文中只包含了java相关的操作,WebDriver还支持c#/Python/Ruby/Perl/PHP/Perl,如有需要,请阅读原文。
3、language binding,又叫glue code,意思是胶水代码,比如有个C++的lib库,java调用这个库的api叫java binding。参考:http://en.wikipedia.org/wiki/Language_binding。
4、措辞拙劣,有些单词句子没有深究直译了,深感从阅读到翻译差的不仅仅是一本字典,还有文化的差异。笔者强烈推荐直接阅读官网上的原文,如果我的译文给你造成误解,深感不安。这也是后三章不敢继续班门弄斧的原因,等我对Selenium熟悉了之后再回来补全。