基于 Selenium WebDriver 的 Web 应用自动化测试(2)基本操作
 
- UID
- 1066743
|

基于 Selenium WebDriver 的 Web 应用自动化测试(2)基本操作
Selenium WebDriver 常用操作Selenium WebDriver 能够模拟日常的浏览器操作,其中最常用的操作如下:
- 访问页面
- 与页面交互
- 填写表单
- 提交页面内容
- 检查页面元素是否在页面上
- 在窗口和 Frame 之间移动
- 弹出对话框
- 页面导航
下面本文将通过一个比较完整的示例分别介绍如上所示常用操作的具体应用。代码片段如下:
清单 1. WebDriver 常用操作1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
| 1.public void setUp() throws Exception {
2. //driver = new HtmlUnitDriver();
3. driver = new FirefoxDriver();
4. baseUrl = "http://www.baidu.com/";
5. driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
6.}
7.
8.@Test
9.public void testDemo() throws Exception {
10. driver.get(baseUrl + "/");
11. driver.findElement(By.id("kw")).clear();
12. driver.findElement(By.id("kw")).sendKeys("百度翻译");
13. driver.findElement(By.id("su")).click();
14.
15. WebElement element;
16. element = driver.findElement(By.id( "op_tran_text" ));
17. //element = driver.findElement(By.xpath( "//textarea[@id= ’ op_tran_text ’ ]" ));
18. element.clear();
19. element.sendKeys("自动化测试");
20.
21. WebElement select = driver.findElement(By.xpath( "//select" ));
22. List<WebElement> allOptions = select.findElements(By.tagName( "option" ));
23. for (WebElement option : allOptions) {
24. System.out.println(String.format( "Value is: %s" , \
option.getAttribute("value")));
25. if(option.getText().equals("zh2en"))
26. option.click();
27. }
28.
29. driver.findElement(By.xpath("//a[@class='op_tran_btn OP_LOG_BTN']")).click();
30.
31.driver.switchTo().window( "百度在线翻译" );
32.}
|
清单第 2-3 行定义了所使用的 webdriver 类型,本部分以 HtmlFirefoxDriver 为例:
1
| WebDriver driver = new HtmlFirefoxDriver();
|
对于其他类型的 driver,其操作是一样的,不同 driver 的区别在于模拟何种类型的浏览器。
页面导航如清单第 10 行所示:
1
| driver.get(baseUrl + "/");
|
完全装载页面后将控制返回给测试脚本。
注意:当页面又很多 Ajax 调用时,该接口无法确认页面是否完全装载,这是需要使用"waits"。
与页面交互如清单第 11-12、15-19 行所示。
例如:
1
2
3
4
5
6
7
8
9
10
11
| <input type= "text" name= "passwd" id= "passwd-id" />
WebElement element;
element = driver.findElement(By.id( "passwd-id" ));
element = driver.findElement(By.name( "passwd" ));
element = driver.findElement(By.xpath( "//input[@id= ’ passwd-id ’ ]" ));
//XPATH 返回第一个匹配到的元素,如果没有匹配到,抛出 NoSuchElementException
element.sendKeys( "some text" );
element.sendKeys( " and some" , Keys.ARROW_DOWN); // 按向下箭头 ; 任何页面元素都可以调用 sendKeys,
//例如可以测试一些快捷方式键,键盘的每次输入都是附加在文本串的后面;
element.clear(); // 清除文本域内容
|
填写表单如清单 21-27 行所示。
- 处理 SELECT 标签
1
2
3
4
5
6
| WebElement select = driver.findElement(By.xpath( "//select" ));
List<WebElement> allOptions = select.findElements(By.tagName("option" ));
for(WebElement option : allOptions) {
System.out.println(String.format( "Value is: %s" , option.getValue()));
option.setSelected();
}
|
- 使用 Select 类处理 SELECT 标签
1
2
3
| Select select = new Select(driver.findElement(By.xpath( "//select" )));
select.deselectAll();
select.selectByVisibleText("Edam");
|
提交如清单第 13、29 行所示。
1
2
| driver.findElement(By.id( "submit" )).click();
element.submit();// 要求 element 必须在表单中,否则抛出 NoSuchElementException
|
检查元素是否在页面上检查元素是否在页面上是最常用的操作之一,具体用法如下:
1
2
| WebElement plain = driver.findElement(By.name( "q" ));
RenderedWebElement element = (RenderedWebElement) element;// 例如 HtmlUnit Driver 就无法显示出内容
|
对元素拖拉:
1
2
3
4
5
| RenderedWebElement element = (RenderedWebElement) driver.findElement(\
By.name( "source" ));
RenderedWebElement target = (RenderedWebElement) driver.findElement(\
By.name( "target" ));
element.dragAndDropOn(target);
|
在窗口和 frame 之间移动如清单第 31 行所示
- 在命名的窗口之间移动
1
| driver.switchTo().window( "windowName" ); // 可以通过 js 或者打开窗口的链接获取窗口名称
|
- 通过窗口句柄切换
1
2
3
| for (String handle : driver.getWindowHandles()) {
driver.switchTo().window(handle);
}
|
- frame 之间切换或者切换到 iframe
1
2
3
4
| driver.switchTo().frame( "frameName" );
通过索引访问 subframe:
driver.switchTo().frame( "frameName.0.child" );//frameName 的第一个 subframe
//的明价 child 的 frame
|
弹出对话框窗口弹出后,可以使用如下语句访问到弹出窗口:
1
| Alert alert = driver.switchTo().alert();
|
获取到 alert 窗口后,可进行各种操作。
页面导航navigate().to() 和 get() 功能完全一样。
1
| driver.navigate().to( "http://www.example.com" );
|
浏览器的前进和后退 :
1
2
| driver.navigate().forward();
driver.navigate().back();
|
注意这两个方法取决于浏览器的实现,可以会出现某些调用失败。 |
|
|
|
|
|