为了复习Selenium API, 把selenium的API doc翻译(参考了Google翻译)如下:
获取页面
一般而言, 你用WebDriver进行的第一件事是进入到某页面. 进入页面的方法是调用'get':
driver.get("http://www.google.com");
由于可能存在的多种因素(包括操作系统/浏览器的原因), WebDriver可能会或可能不会等待页面加载. 在某些情况下, WebDriver可能会在页面完成甚至加载之前返回执行下一步. 为了保证健壮性, 你需要使用"显式等待和隐式等待"来等待页面中元素的加载.
定位UI元素(WebElements)
WebDriver中的元素定位可以在WebDriver实例本身上或在WebElement上完成. Selenium支持的编程语言都有“Find Element”和“Find Elements”方法. 前者(Find Element)返回符合查询条件的WebElement对象, 如果找不到符合条件的元素, 则抛出异常,后者(Find Elements)返回符合条件的多个WebElement组成的列表, 如果找不到符合条件的元素, 则返回空列表.
“Find”方法通过“By”去定位或查询对象. 下面列出了"By"的方式.
By ID
这是最有效及最推荐的定位元素的方式. 页面上的非唯一ID或自动生成的ID都应避免使用此方法. 此时, 通过类名方式查找元素比使用自动生成的id更合适.
如何查找如下所示元素的示例:
<div id="coolestWidgetEvah">...</div>
WebElement element = driver.findElement(By.id("coolestWidgetEvah"));
By Class Name (类名)
此处的"Class"指DOM元素上的属性. 在实际使用中, 通常有许多具有相同类名的DOM元素. 因此, 与查找第一个元素相比, 使用元素组查找是更好的选择.
如何查找如下所示元素的示例:
<div class="cheese"><span>Cheddar</span></div><div class="cheese"><span>Gouda</span></div>
List<WebElement> cheeses = driver.findElements(By.className("cheese"));
By Tag Name (标签名)
元素的DOM标签名称.
如何查找如下所示元素的示例:
<iframe src="..."></iframe>
WebElement frame = driver.findElement(By.tagName("iframe"));
By Name(名称)
查找匹配名称属性的元素.
如何查找如下所示元素的示例:
<input name="cheese" type="text"/>
WebElement cheese = driver.findElement(By.name("cheese"));
By Link Text (超链文字)
查找内容完全匹配链接文字的元素.
如何查找如下所示元素的示例:
<a href="http://www.google.com/search?q=cheese">cheese</a>>
WebElement cheese = driver.findElement(By.linkText("cheese"));
By Partial Link Text (部分超链文字)
查找一部分内容匹配链接文字的元素.
如何查找如下所示元素的示例:
<a href="http://www.google.com/search?q=cheese">search for cheese</a>>
WebElement cheese = driver.findElement(By.partialLinkText("cheese"));
By CSS
顾名思义, 这是通过CSS的定位方式. 一般情况下浏览器均支持CSS, 请参阅w3c css选择器获取常用css选择器. 如果浏览器不支持CSS查询, 则请使用Sizzle. IE 6, 7和FF3.0可使用Sizzle作为CSS查询引擎.
请注意, 并非所有浏览器都是一样的, 某些可能在一个版本中使用的CSS可能在另一个版本中无法使用.
如何查找如下所示元素的示例:
<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"));
By XPath
在程序最外层(At a high level), WebDriver尽可能使用浏览器自身的XPath引擎. 在那些不支持XPath的浏览器上, 我们提供了自己的实现方式. 除非您知道各种XPath引擎之间的差异, 否则这可能会导致某些意外行为.
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"));
被查找到的元素的个数:
XPath表达式 | HtmlUnit Driver | Firefox Driver | Internet Explorer Driver |
//input | 1 (得到"example") | 2 | 2 |
//INPUT | 0 | 2 | 0 |
有时HTML元素不需要显式声明属性, 因为它们将默认为已知值. 例如, “input”标签不需要“type”属性, 因为它默认为“text”. 在WebDriver中使用xpath时不应期望能够与使用这些隐式属性匹配元素.
使用JavaScript
WebDriver支持使用JavaScript来查找元素, 只要其执行结果返回DOM元素, 该元素就会自动转换为WebElement对象.
加载jQuery的页面的简单示例:
WebElement element = (WebElement) ((JavascriptExecutor)driver).executeScript("return $('.cheese')[0]");
查找页面上每个标签的所有输入元素:
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);
获取文本值(Getting text values)
人们通常希望获取元素内包含的文本值. 以下将返回字符串类型的值. 请注意, 这只会返回页面上可见文本.
WebElement element = driver.findElement(By.id("elementID"));
element.getText();
用户输入 - 填表(User Input - Filling In Forms)
我们已经了解了如何在文本区域或文本字段中输入文本, 但是其他元素呢? 你可以“切换”复选框的状态, 也可以使用“单击”来设置类似选中的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中取消选择所有OPTION, 然后选择文本值为“ Edam”的OPTION.
填写完表格后, 可能需要提交. 一种方法是找到“submit”按钮元素并单击它:
driver.findElement(By.id("submit")).click();
另外,WebDriver在每个元素上都提供了“submit”这个更方便的方法. 如果在表单标签范围内的元素上调用此方法, 则WebDriver将在DOM上移动, 直到找到表单的结束标签. 然后在该表单上调用Submit. 如果调用"submit"方法的元素不在表单标签中, 将抛出'NoSuchElementException':
element.submit();
在窗口和框架之间移动(Moving Between Windows and Frames)
某些Web应用程序具有多个框架(Frames)或多个窗口(Windows). WebDriver支持使用“switchTo”方法在已命名的窗口之间移动:
driver.switchTo().window("windowName");
现在,对driver的所有调用都将在此移动后的窗口上解释执行. 但是, 怎么获取窗口的名称呢? 看一下打开它的JavaScript或链接:
<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); }
你还可以从一个框架(frame)切换到另一个框架(或切换到iframes)
driver.switchTo().frame("frameName");
弹出对话框(Popup Dialogs)
从Selenium 2.0 beta 1开始, 内置了对弹出对话框的支持. 触发打开弹出窗口的操作后, 您可以通过以下方式访问Alert对话框:
Alert alert = driver.switchTo().alert();
上述代码将返回当前打开的Alert对象. 拿到Alert对象后, 你现在可以接受, 关闭, 阅读其内容, 甚至可以键入提示. 这些接口在alerts, confirms, 和prompts等对话框同样有效. 有关更多信息, 请参考JavaDocs或RubyDocs.
导航: 历史和直达(Navigation: History and Location)
之前, 我们介绍了使用“ 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
在我们进入下一步之前, 你可能有兴趣了解如何使用Cookie. 首先, 您需要位于该cookie对其有效的域上. 如果您在开始与网站进行交互之前尝试预设Cookie, 并且您的首页很大/需要一段时间才能加载, 则可以选择在网站上找到一个较小的页面(通常404页面很小, 例如 http://example.com/some404page).
// 进入正确的域名 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 // By name driver.manage().deleteCookieNamed("CookieName"); // By Cookie driver.manage().deleteCookie(loadedCookie); // 或所有 driver.manage().deleteAllCookies();
更改用户代理(Changing the User Agent)
使用Firefox Driver是很容易实现的:
FirefoxProfile profile = new FirefoxProfile(); profile.addAdditionalPreference("general.useragent.override", "some UA string"); WebDriver driver = new FirefoxDriver(profile);
拖拽(Drag and Drop)
以下是一个使用Actions类执行拖拽操作的示例. 本地事件需要打开(Native events are required to be enabled).
WebElement element = driver.findElement(By.name("source")); WebElement target = driver.findElement(By.name("target")); (new Actions(driver)).dragAndDrop(element, target).perform();