[翻译]Selenium API 命令和操作(JAVA)

为了复习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等对话框同样有效. 有关更多信息, 请参考JavaDocsRubyDocs.

导航: 历史和直达(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();

猜你喜欢

转载自www.cnblogs.com/fayez/p/11837550.html
今日推荐