UI自动化测试(三)对页面中定位到的元素对象做相应操作


 前两天分别讲述了UI自动化测试基础以及对页面元素该如何进行定位,这一篇自然就是对定位到的页面元素对象进行相应操作啦。

阅读目录

1.常用操作元素对象的方法

2.鼠标事件操作

3.键盘事件操作

4.WebElement接口常用方法

5.设置等待时间

6.打印验证信息

7.定位一组对象操作

8.层级定位操作

9.定位frame中对象操作

10.alert/confirm/prompt处理

11.下拉框处理

12.select菜单处理

13.selinium中调用js

)).click(); 32 Thread.sleep(1000); 33 34 //重现步骤 35 //switchTo()从外html文件跳到内html文件中 36 driver.switchTo().frame(driver.findElement(By.xpath("//div[@class='ke-edit']/iframe"))); 37 WebElement step=driver.findElement(By.xpath("//body[@class='article-content']")); 38 step.sendKeys(Keys.ARROW_RIGHT); 39 step.sendKeys(Keys.ARROW_RIGHT); 40 step.sendKeys(Keys.ARROW_RIGHT); 41 step.sendKeys(Keys.ARROW_RIGHT); 42 step.sendKeys("打开禅道"); 43 Thread.sleep(1000); 44 //step.sendKeys(Keys.ARROW_DOWN); 45 step.sendKeys(Keys.ARROW_DOWN); 46 step.sendKeys("不能打开"); 47 Thread.sleep(1000); 48 step.sendKeys(Keys.ARROW_DOWN); 49 //step.sendKeys(Keys.ARROW_DOWN); 50 step.sendKeys("正常打开"); 51 Thread.sleep(1000); 52 driver.switchTo().defaultContent(); 53 //浏览器拉到最底部 54 ((JavascriptExecutor)driver).executeScript("window.scrollTo(0,document.body.scrollHeight)"); 55 //点击保存按钮 56 driver.findElement(By.xpath("//button[@id='submit']")).click(); 57 58 } 59 }

switch_to_frame的参数必须是id或者是name, 所以一个frame只要有id和name处理起来很容易。如果没有的话,两种解决思路:

①加上id或者name

②使用xpath等方式定位然后实现跳转

10.alert/confirm/prompt处理

WebDriver中处理原生JS的 alert 、confirm 以及prompt非常方便。

具体思路是使用switchTo.alert()方法定位到当前的 alert/confirm/prompt(这里注意当前页面只能同时含有一个控件,如果多了会报错的,所以这就需要一一处理了),然后在调用Alert 的方法进行操作

  alert只有确定按钮

  confirm有确定和取消按钮

  prompt可以输入文字,有确定和取消按钮

Alert提供了以下几个方法:

①getText: 返回alert/confirm/prompt中的文字内容

②accept : 点击确认按钮

③dismiss : 点击取消按钮如果有取消按钮的话

④sendKeys :  向prompt中输入文字

备注:send_keys这个方法在chromedriver中输入后不会显示,js弹窗延时用固定等待 实现代码如下,仅供参考:
 1 package com.ui.day1;
 2 
 3 import org.openqa.selenium.Alert;
 4 import org.openqa.selenium.By;
 5 import org.openqa.selenium.WebDriver;
 6 import org.openqa.selenium.chrome.ChromeDriver;
 7 
 8 public class yihuqingjiu_test_demo_js {
 9 
10     public static void main(String[] args) throws Exception {
11         //chrom浏览器驱动的位置
12         System.setProperty("webdriver.chrome.driver","C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
13         //web驱动指向chrom驱动并创建对象driver
14         WebDriver driver=new ChromeDriver();
15         //获取网址
16         driver.get("file:///C:/Users/hongboss/Desktop/js%E4%BB%A3%E7%A0%81/%E5%AF%B9%E8%B1%A1.html?");
17         //浏览器最大化
18         driver.manage().window().maximize();
19         driver.findElement(By.cssSelector("#btn")).click();
20         Thread.sleep(1000);
21         Alert alter=driver.switchTo().alert();
22         Thread.sleep(1000);
23         System.out.println(alter.getText());
24         alter.accept();
25         driver.findElement(By.cssSelector("#btn1")).click();
26         Thread.sleep(1000);
27         Alert alter1=driver.switchTo().alert();
28         Thread.sleep(1000);
29         System.out.println(alter1.getText());
30         alter1.dismiss();
31         driver.findElement(By.cssSelector("#btn2")).click();
32         Thread.sleep(1000);
33         Alert alter2=driver.switchTo().alert();
34         Thread.sleep(1000);
35         System.out.println(alter2.getText());
36         alter2.sendKeys("hello");
37         Thread.sleep(1000);
38         alter2.accept();
39 
40     }
41 
42 }

11.下拉框处理

web页面上经常会有下拉框,对下拉框的处理比较简单,一般分为两种情况:

①普通下拉框通过层级定位识别

②有些下拉框是鼠标移上去直接弹出的,可以使用(鼠标移动上去自动显示的下拉框)

方法一实现代码如层级定位中所举例代码思想一致,这里就不再列举

方法二实现代码如下,仅供参考:

 1 package com.ui.day2;
 2 
 3 import org.openqa.selenium.By;
 4 import org.openqa.selenium.WebDriver;
 5 import org.openqa.selenium.WebElement;
 6 import org.openqa.selenium.chrome.ChromeDriver;
 7 import org.openqa.selenium.interactions.Actions;
 8 
 9 public class yihuqingjiu_test_baidu_float {
10 
11     public static void main(String[] args) {
12         System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
13         WebDriver driver=new ChromeDriver();
14         driver.get("https://www.baidu.com");
15         driver.manage().window().maximize();
16         //定位更多产品
17         WebElement move=driver.findElement(By.cssSelector(".bri"));
18         Actions action=new Actions(driver);
19         action.moveToElement(move).perform();
20         //driver.findElement(By.cssSelector(".bdbriimgitem_3")).click();
21         driver.findElement(By.cssSelector(".bdbriimgitem_6")).click();
22     }
23 
24 }

12.select菜单处理

实现方法有如下四种:

①鼠标点击事件,move

②层级关系

③list列表

④selector方法

方法一实现代码如下拉框处理中方法二所示

方法二实现代码如层级定位中所示

方法三实现代码如下,仅供参考:

 1 package com.ui.day1;
 2 
 3 import java.util.List;
 4 
 5 import org.openqa.selenium.By;
 6 import org.openqa.selenium.WebDriver;
 7 import org.openqa.selenium.WebElement;
 8 import org.openqa.selenium.chrome.ChromeDriver;
 9 
10 public class yihuqingjiu_test_demo_list {
11 
12     public static void main(String[] args){
13         System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
14         WebDriver driver=new ChromeDriver();
15         driver.get("https://www.baidu.com/");
16         driver.manage().window().maximize();
17         //把列表内容放到list中
18         List list=driver.findElements(By.cssSelector("a.mnav"));
19         //Thread.sleep(3000);
20         //取出列表中的具体值,并点击
21         list.get(2).click();
22 
23     }
24 
25 }

方法四中还包含三种方法,分别是:

  selectByIndex(int index)   //通过index

  selectByVisibleText(String text)   //通过匹配到的可见字符

  selectByValue(String value)    //通过匹配到标签里的value

代码实现如下,仅供参考:

 1 package com.ui.day1;
 2 
 3 import org.openqa.selenium.By;
 4 import org.openqa.selenium.WebDriver;
 5 import org.openqa.selenium.WebElement;
 6 import org.openqa.selenium.chrome.ChromeDriver;
 7 import org.openqa.selenium.support.ui.Select;
 8 
 9 public class yihuqingjiu_test_demo_select {
10 
11     public static void main(String[] args) throws Exception {
12         System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
13         WebDriver driver=new ChromeDriver();
14         driver.get("file:///F:/17new/12%20UI%E8%87%AA%E5%8A%A8%E5%8C%96/html/ui_day1_test.html");
15         driver.manage().window().maximize();
16         WebElement selector=driver.findElement(By.id("select"));
17         Select select = new Select(selector);
18         select.selectByVisibleText("有经验");
19         Thread.sleep(2000);
20         select.selectByValue("无经验");
21         Thread.sleep(2000);
22         select.selectByIndex(1);
23 
24     }
25 
26 }

特殊下拉框:

还有一种下拉框就是联想形式的,比如下百度搜索框中输入12306,会出现多个选项,用代码实现去选择下拉中的内容,代码实现如下:

 1 package com.ui.day3;
 2 
 3 import java.util.List;
 4 
 5 import org.openqa.selenium.By;
 6 import org.openqa.selenium.WebDriver;
 7 import org.openqa.selenium.WebElement;
 8 import org.openqa.selenium.chrome.ChromeDriver;
 9 
10 public class yihuqingjiu_test_select_12306 {
11 
12     public static void main(String[] args) throws Exception {
13         System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
14         WebDriver driver=new ChromeDriver();
15         driver.get("https://www.baidu.com/");
16         driver.manage().window().maximize();
17         //定位输入框,并输入内容
18         driver.findElement(By.cssSelector("#kw")).sendKeys("12306");
19         //点击输入框
20         driver.findElement(By.cssSelector("#kw")).click();
21         Thread.sleep(1000);
22         //把列表内容放到list中
23         List list=driver.findElements(By.cssSelector("form#form div.bdsug ul li"));
24         //Thread.sleep(3000);
25         //取出列表中的具体值,并点击
26         list.get(1).click();
27 
28     }
29 
30 }

13.selenium中调用js

当webdriver遇到无法完成的操作时候,这个时候可以使用javascript来完成,webdriver提供了execute_script()接口来调用js代码。

执行js有两种场景:

①在页面上直接执行js

②在某个已经定位的元素上执行js

场景①其实在alter/confirm/prompt处理已介绍过在页面上如何执行js了,可参考。

场景②在设置等待时间已介绍如何高亮处理,都有介绍。

js还可以做下拉滚动条,在做自动化测试的时候,这个办法缺一不可。之前我在做自动化时,就因为没加滚动条,而导致脚本一直运行不成功,因为脚本只能执行在当前页面所显示的操作,因此需要滚动条。

JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("scrollTo(0,10000)");----------------------------------------------向下拉到底
Thread.sleep(2000);
js.executeScript("scrollBy(0, 0-document.body.scrollHeight *99/100)");--------------向上拉到顶
Thread.sleep(2000);
js.executeScript("scrollTo(0,100000)");---------------------------------------------向下拉到底
Thread.sleep(2000);
js.executeScript("scrollTo(0,1)");--------------------------------------------------向上拉到顶
Thread.sleep(2000);
js.executeScript("scrollTo(0,1000)");
Thread.sleep(2000);
js.executeScript("scrollBy(0, 0-document.body.scrollHeight *1/2)");-----------------拉到中间
Thread.sleep(2000);
js.executeScript("scrollBy(0, 0-document.body.scrollWidht *1/2)");------------------左右拉到中间