上节我们已经介绍了几个常用的控件操作方法,理论上已经可以操作绝大多数控件,同样WebDriver提供了一些特殊方法,用于操作一些特殊情况。


下拉框操作

下拉框操作除了通过两次点击(1.点击下拉框,2.点击下拉框选项)外,JAVA版本的WebDriver还提供了Select 类用来专门处理下拉框元素。

HTML常见如下:

  1. <select name="select">
  2. <option value="chrome">Chrome</option>
  3. <option value="ie">IE</option>
  4. <option value="firefox">Firefox</option>
  5. <option value="safari">Safari</option>
  6. </select>

选取下拉选择,代码示例:

  1. @Test
  2. public void selectTest() throws InterruptedException {
  3. // 打开测试页面
  4. driver.get("file:///D:/html/index.html");
  5. // 定位下拉框
  6. WebElement selectHtml = driver.findElement(By.name("select"));
  7. // 实例化Select
  8. Select select = new Select(selectHtml);
  9. // 为了看效果,线程等待2S
  10. Thread.sleep(2000);
  11. // 通过下拉框文本值选取
  12. select.selectByVisibleText("IE");
  13. // 为了看效果,线程等待2S
  14. Thread.sleep(2000);
  15. // 通过下拉框索引选取
  16. select.selectByIndex(2);
  17. // 为了看效果,线程等待2S
  18. Thread.sleep(2000);
  19. // 通过 value 属性值选取
  20. select.selectByValue("chrome");
  21. }

说明:

  1. Select 类只能用于被标签包围的元素中,也就是必须是标准下拉控件
  2. selectByVisibleText()传入的参数是option标签的text值
  3. selectByIndex() 传入的参数是option标签的索引值
  4. selectByValue() 传入的参数是option标签的value属性值

获取下拉框文本值,代码示例:

  1. @Test
  2. public void getOptionsTest(){
  3. // 打开测试页面
  4. driver.get("file:///D:/html/index.html");
  5. // 定位下拉框
  6. WebElement selectHtml = driver.findElement(By.name("select"));
  7. // 实例化Select
  8. Select select = new Select(selectHtml);
  9. // 获取第一个选择选项
  10. WebElement element = select.getFirstSelectedOption();
  11. // 获取第一选项的Text
  12. String text = element.getText();
  13. System.out.println(text);
  14. // 获取所有的选项
  15. List<WebElement> optionsList= select.getOptions();
  16. // 循环输出所有选项的Text
  17. for(WebElement option:optionsList){
  18. String optionText = option.getText();
  19. System.out.println(optionText);
  20. }
  21. }

说明:

  1. getFirstSelectedOption()常用与获取当前选项或者默认选项文本
  2. getOptions()用于获取所有的下拉选项,返回List

Alert的操作

测试用例:

  1. 1. 打开“UI自动化测试”主页
  2. 2. 点击Alert按钮
  3. 3. alert警告框点击确定按钮

代码实现:

  1. @Test
  2. public void alertTest() throws InterruptedException {
  3. driver.get("file:///C:/selenium_html/index.html");
  4. driver.findElement(By.className("alert")).click();
  5. Thread.sleep(3000);
  6. // 把控制权转交给 alert
  7. Alert alert = driver.switchTo().alert();
  8. // 获取警告框的文本值
  9. String text = alert.getText();
  10. System.out.println(text);
  11. // 点击警告窗确定按钮
  12. alert.accept();
  13. }

说明:

Alert警告窗无法通过正常元素那样去定位警告窗,所以自然就无法直接调用click()方法去点击确定按钮。所以想要处理alert警告窗我们需要把driver控制权转移给alert类型,然后调用alert的getText()的方法获取警告窗文本,调用accept()方法去模拟点击确定按钮。


Confirm的操作

测试用例:

  1. 1. 打开“UI自动化测试”主页
  2. 2. 点击Confirm按钮
  3. 3. Confirm警告框点击确定\取消按钮

代码实现:

  1. @Test
  2. public void confirmTest() throws InterruptedException {
  3. driver.get("file:///C:/selenium_html/index.html");
  4. driver.findElement(By.className("confirm")).click();
  5. Thread.sleep(3000);
  6. // driver控制权转交给 alert
  7. Alert alert = driver.switchTo().alert();
  8. // 点击取消
  9. alert.dismiss();
  10. Thread.sleep(3000);
  11. // 点击确定
  12. alert.accept();
  13. }

说明:

confirm弹窗类似alert,但是多了个取消按钮,如果想模拟点击取消按钮操作,我们需要调用dismiss()方法实现。


Prompt的操作

测试用例:

  1. 打开“UI自动化测试”主页
  2. 点击Prompt按钮
  3. 在Prompt 弹窗中,输入“这个是Prompt”
  4. 点击确定\取消按钮

代码实现:

  1. @Test
  2. public void promptTest() throws InterruptedException {
  3. driver.get("file:///C:/selenium_html/index.html");
  4. driver.findElement(By.className("prompt")).click();
  5. Thread.sleep(3000);
  6. // driver控制权转交给 alert
  7. Alert alert = driver.switchTo().alert();
  8. // 往弹窗输入 文本
  9. alert.sendKeys("这个是Prompt");
  10. Thread.sleep(2000);
  11. alert.accept();
  12. Thread.sleep(3000);
  13. alert.accept();
  14. Thread.sleep(3000);
  15. }

说明:

操作基本同以上两钟警告窗,但是prompt弹窗多了可输入的文本框,同样无法定位,所以要操作文本框可以调用alert的sendKeys()方法实现。


iFrame 的操作

思路:

  1. 1. 定位iFrame
  2. 2. driver控制权交给iFrame
  3. 3. 操作iFrame里面的元素
  4. 4. 操作完成把driver控制权交回原页面

测试用例:

  1. 1. 打开“UI自动化测试”主页
  2. 2. frame:input 输入框输入文本

代码实现:

  1. @Test
  2. public void iframeTest() throws InterruptedException {
  3. driver.get("file:///C:/selenium_html/index.html");
  4. // 通过 ID 或者 name 方式 转交控制权
  5. //driver.switchTo().frame("aa");
  6. WebElement iframe = driver.findElement(By.tagName("iframe"));
  7. // 通过webelement 方式转交driver控制权
  8. driver.switchTo().frame(iframe);
  9. driver.findElement(By.linkText("baidu")).click();
  10. Thread.sleep(3000);
  11. // driver 控制权转交给原来界面
  12. driver.switchTo().defaultContent();
  13. driver.findElement(By.linkText("登陆界面")).click();
  14. }

说明:

driver.switchTo().frame(“aa”)中“aa”默认为frame元素的id或者name的属性值。如果frame元素没有id也没有name那么我们完全可以用其它定位到frame然后传入一个WebElemet元素便可。


多窗口操作

思路:

  1. 获取当前窗口的handle值
  2. 获取所有窗口的handle值
  3. 循环判断所有的窗口的handle值,如果不为第一步获取的值,则跳转

测试用例:

  1. 打开“UI自动化测试”页面
  2. 点击“Open new window”
  3. 在新开的界面iframe:input 文本框输入文本
  4. 关闭新开的窗口
  5. 再原来的界面文本框输入文本

代码实现:

  1. @Test
  2. public void testWin() throws InterruptedException {
  3. driver.get("file:///C:/selenium_html/index.html");
  4. // 当前driver所在的页面的 句柄值
  5. String handle1 = driver.getWindowHandle();
  6. driver.findElement(By.linkText("Open new window")).click();
  7. Thread.sleep(3000);
  8. // For 循环判断 获取到的handles是否等于handle1
  9. for (String handles : driver.getWindowHandles()) {
  10. if (handles.equals(handle1)) {
  11. continue;
  12. }
  13. driver.switchTo().window(handles);
  14. }
  15. driver.findElement(By.linkText("baidu")).click();
  16. // driver 控制权交回第一个窗口
  17. driver.switchTo().window(handle1);
  18. }

上传文件的处理

上传文件操作需要弹出我们的win窗口,而win窗口我们是无法通过WebDriver去识别元素做操作,那是不是意味着上传文件我们WebDriver就无法完成呢?
其实相反,上传文件操作非常容易,我们还是可以通过已经学过的sendKeys()方法完成。

思路:

  1. 1. 定位上传控件
  2. 2. 使用sendKeys()方法,并传入文件路径

测试用例:

  1. 1. 打开“UI 测试页面”
  2. 2. 实现上传操作

代码实现:

  1. @Test
  2. public void uploadTest() {
  3. driver.get("file:///C:/selenium_html/index.html");
  4. // 定位上传控件,传入本地文件路径
  5. driver.findElement(By.id("load")).sendKeys("c:\\a.html");
  6. }