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

阅读目录

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

2.鼠标事件操作

3.键盘事件操作

4.WebElement接口常用方法

5.设置等待时间

6.打印验证信息

7.定位一组对象操作

8.层级定位操作

9.定位frame中对象操作

10.alert/confirm/prompt处理

11.下拉框处理

12.select菜单处理

13.selinium中调用js

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

webdriver中常用的操作元素的方法有如下几个:

  clear : 清除对象的内容

  send_keys : 在对象上模拟按键输入, 注意如果是函数需要增加转义符

  click : 单击对象, 强调对象的独立性

  submit : 提交表单, 要求对象必须是表单, 强调对象必须是表单

代码如下,仅供参考:

 package com.ui_auto;

 import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver; public class yihuqingjiu_test_12306 { public static void main(String[] args) throws Exception {
//chrom浏览器驱动的位置
System.setProperty("webdriver.chrome.driver","C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
//web驱动指向chrom驱动并创建对象driver
WebDriver driver=new ChromeDriver();
//获取网址
driver.get("https://www.baidu.com");
//浏览器最大化
driver.manage().window().maximize();
//kw是输入框的id,12306是在输入框中药输入的内容
driver.findElement(By.id("kw")).sendKeys("12306");
//su是搜索按钮的id
WebElement btn=driver.findElement(By.id("su"));
//点击事件
btn.submit();
//休眠时间
Thread.sleep(3000);
//关闭页面
driver.close();
} }

注意:

click():模拟鼠标点击元素
submit():提交表单(按钮),无法点击链接,当按钮无法在页面上点击到时用submit()(按钮被遮挡)

2.鼠标事件操作

在实际的web产品测试中,对于鼠标的操作,不单单只有click(),有时候还要用到右击、双击、拖动等操作,这些操作包含在Actions类中。
Actions类中鼠标操作常用方法:
1. contextClick() :右击
2. doubleClick() :双击
3. dragAndDrop() :拖动
4. moveToElement() :鼠标移动到一个元素上      (悬停)
5. click_and_hold() :按下鼠标左键在一个元素上   (左)
6. release() :鼠标释放
代码举例部分方法,仅供参考:
 package com.ui.day1;

 import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions; public class yihuqingjiu_test_demo3_mouse { public static void main(String[] args) throws Exception {
System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
WebDriver driver=new ChromeDriver();
//浏览器要加载的url
driver.get("https://www.baidu.com");
//窗口最大化
driver.manage().window().maximize(); //右击操作
// WebElement e=driver.findElement(By.cssSelector("div#lg>img"));
// Actions action=new Actions(driver);
// action.contextClick(e).perform();
//鼠标移动
WebElement move=driver.findElement(By.cssSelector("a[name='tj_briicon']"));
Actions action=new Actions(driver);
action.moveToElement(move).perform();
Thread.sleep(2000);
driver.findElement(By.cssSelector("a[name='tj_mp3']")).click();
driver.close(); } }

ActionChains用于生成用户的行为,所有的行为都存储在action对象,通过perform()执行存储的行为perform()执行所有ActionChains存储的行为,perform()同样也是ActionChains类提供的方法,经常结合在一起使用

3.键盘事件操作

在实际的web测试工作中, 需要配合键盘按键来操作, 对于键盘的模拟操作,Actions 类中有提供 keyUp(theKey)、 keyDown(theKey)、 sendKeys(keysToSend)等方法来实现。

在 WebDriver API 中,KeyDown(Keys theKey)、KeyUp(Keys theKey) 方法的参数只能是修饰键:Keys.SHIFT、Keys.ALT、Keys.CONTROL, 否者将抛出IllegalArgumentException 异常。其次对于action.keyDown(theKey) 方法的调用,如果没有显示的调用 action.keyUp(theKey) 或者 action.sendKeys(Keys.NULL) 来释放的话, 这个按键将一直保持按住状态。

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

 package com.ui.day1;

 import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions; public class yihuqingjiu_test_demo3_mouse { public static void main(String[] args) throws Exception {
System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
WebDriver driver=new ChromeDriver();
//浏览器要加载的url
driver.get("https://www.baidu.com");
//窗口最大化
driver.manage().window().maximize(); //按下tab键
// WebElement tab=driver.findElement(By.cssSelector("#kw"));
// tab.sendKeys(Keys.TAB);
//按下退格键
// WebElement tab1=driver.findElement(By.cssSelector("#kw"));
// tab1.sendKeys("12306");
// Thread.sleep(1000);
// tab1.sendKeys(Keys.BACK_SPACE);
// Thread.sleep(1000);
//按下组合键
// Actions action=new Actions(driver);
// WebElement ctr1=driver.findElement(By.cssSelector("#kw"));
// action.keyDown(Keys.CONTROL).sendKeys("v").sendKeys(Keys.NULL).keyUp(Keys.CONTROL).perform(); //按下ctrl+f4
// WebElement ctr1=driver.findElement(By.cssSelector("#kw"));
// ctr1.sendKeys("12306");
// Thread.sleep(1000);
// Actions action=new Actions(driver);
// action.keyDown(Keys.CONTROL).sendKeys(Keys.F4).keyUp(Keys.CONTROL).perform();
//按下ctrl+shift+delete
Actions action=new Actions(driver);
action.keyDown(Keys.CONTROL).keyDown(Keys.SHIFT).sendKeys(Keys.DELETE).keyUp(Keys.CONTROL).keyUp(Keys.SHIFT).perform();
driver.close(); } }

4.WebElement接口常用方法

WebElement接口常用方法

getSize(): 返回对象的尺寸

getText(): 获取对象的文本

get_attribute("属性名"): 获取对象的属性值

isDisplayed(): 用来判断对象是否可见, 即css的display属性是否为none

isEnabled(): 判断对象是否被禁用

isSelected(): 判断对象是否被选中

getTagName(): 获取对象标签名称

getLocation(): 获取元素坐标

getCookies()/getCookieNamed(cookie_name): 返回当前会话中的cookies

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

 package com.ui.day1;

 import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver; public class yihuqingjiu_test_demo3_WebElement { public static void main(String[] args) throws Exception {
System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
WebDriver driver=new ChromeDriver();
//浏览器要加载的url
driver.get("https://www.baidu.com");
//窗口最大化
driver.manage().window().maximize(); //返回对象尺寸
// int height=driver.findElement(By.cssSelector("#kw")).getSize().height;
// int width=driver.findElement(By.cssSelector("#kw")).getSize().width;
// System.out.println("height:"+height+"..."+"width:"+width);
//获取对象文本
// String text=driver.findElement(By.cssSelector("a[name='tj_trmap']")).getText();
// System.out.println(text);
//获取对象属性值
// String id=driver.findElement(By.cssSelector("#su")).getAttribute("id");
// System.out.println(id);
// String value=driver.findElement(By.cssSelector("#su")).getAttribute("value");
// System.out.println(value);
//判断对象是否可见
// boolean su =driver.findElement(By.cssSelector("#su")).isDisplayed();
// System.out.println(su);
// //判断对象是否被禁用
// boolean su1=driver.findElement(By.cssSelector("#kw")).isEnabled();
// System.out.println(su1);
// //判断对象是否被选中
// boolean su2=driver.findElement(By.cssSelector("#su")).isSelected();
// System.out.println(su2);
//获取对象标签名称
// String input=driver.findElement(By.cssSelector("#kw")).getTagName();
// System.out.println(input);
//获取元素坐标,获取到的只是左上角的坐标
int x=driver.findElement(By.cssSelector("#su")).getLocation().x;
System.out.println(x);
int y=driver.findElement(By.cssSelector("#su")).getLocation().y;
System.out.println(y);
String z=driver.findElement(By.cssSelector("#su")).getLocation().toString();
System.out.println(z);
driver.close(); } }

5.设置等待时间

为了保证脚本的稳定性, 这就需要引入等待时间, 等待页面加载元素后再进行操作,不然会出现后者页面元素定位不到,而导致脚本运行出错, selenium提供三种等待时间设置方式。

①Thread.sleep(): 固定休眠时间设置,Java的Thread类里提供了休眠方法sleep,导入包后就能使用;需要注意的是:sleep()方法以毫秒为单位。

Thread.sleep(2000);//固定延时2秒

② implicitlyWait():implicitlyWait()方法比sleep()方法智能,sleep()方法只能在一个固定的时间等待,而implicitlyWait()可以在一个时间范围内等待,称为隐式等待。

好比如:设置等待时间5s,页面上的元素3s后出现,只等待3s。不会等待5s隐性的等待其实就相当于设置全局的等待,在定位元素时,对所有元素设置超时时间,但对于页面跳转的地方该方法会导致出错,会抛出异常信息,如下所示:

Exception in thread "main" org.openqa.selenium.StaleElementReferenceException: stale element reference: element is not attached to the page document

这是提醒页面元素过期,解决办法,在出错的上一行代码加一个固定等待即可。

隐式等待代码举例如下,仅供参考:

 package com.ui.day1;

 import java.util.concurrent.TimeUnit;

 import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait; public class yihuqingjiu_wait { public static void main(String[] args) throws Exception {
System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
WebDriver driver=new ChromeDriver();
//浏览器要加载的url
driver.get("https://www.baidu.com/");
//窗口最大化
driver.manage().window().maximize(); //隐式等待
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
//定位百度首页输入框
driver.findElement(By.cssSelector("#kw")).sendKeys("苏宁易购");
//点位搜索按钮
WebElement su=driver.findElement(By.cssSelector("#su"));
su.click();
String cl = driver.findElement(By.cssSelector("#su")).getAttribute("class");
System.out.println(cl);
//定位苏宁易购的官方网址
Thread.sleep(2000);
WebElement left=driver.findElement(By.cssSelector("div#content_left a:nth-of-type(1)"));
left.click();
//高亮代码
((JavascriptExecutor) driver).executeScript(
"arguments[0].style.border='5px solid yellow'", su);
((JavascriptExecutor) driver).executeScript(
"arguments[0].style.border='5px solid yellow'", left); } }

此处的高亮代码指的是,定位到的元素位置用js加个效果,从而实现高亮,效果图如下所示:

③WebDriverWait():显示等待就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么就跳出Exception。

显示等待检查机制:每隔500毫秒检查一次页面上的元素是否存在,如果存在则返回
代码举例如下,仅供参考:
 package com.ui.day1;

 import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait; public class yihuqingjiu_wait { public static void main(String[] args) throws Exception {
System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
WebDriver driver=new ChromeDriver();
//浏览器要加载的url
driver.get("https://www.baidu.com/");
//窗口最大化
driver.manage().window().maximize(); //显示等待
//定位百度首页输入框
driver.findElement(By.cssSelector("#kw")).sendKeys("苏宁易购");
//点位搜索按钮
WebElement su=driver.findElement(By.cssSelector("#su"));
su.click();
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement wt = wait.until(new ExpectedCondition<WebElement>() {
public WebElement apply(WebDriver d) {
return d.findElement(By.cssSelector("div#content_left a:nth-of-type(1)"));
}
});
String cl = driver.findElement(By.cssSelector("#su")).getAttribute("class");
System.out.println(cl);
((JavascriptExecutor) driver).executeScript(
"arguments[0].style.border='5px solid yellow'", wt);
} }

显示等待是使用了一个匿名函数来实现,代码中,driver会传给d,d就相当于浏览器的驱动,然后再去查找需要的元素,其中只有十秒钟的时间,时间可更改。

6.验证信息

通过获取页面的title、URL地址,页面上的标识信息来判断用例是否执行成功。

代码试下如下,仅供参考:

 package com.ui_auto;

 import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver; public class yihuqingjiu_test_12306 { public static void main(String[] args) throws Exception {
//chrom浏览器驱动的位置
System.setProperty("webdriver.chrome.driver","C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
//web驱动指向chrom驱动并创建对象driver
WebDriver driver=new ChromeDriver();
//获取网址
driver.get("https://www.baidu.com");
//浏览器最大化
driver.manage().window().maximize();
//kw是输入框的id,12306是在输入框中药输入的内容
driver.findElement(By.id("kw")).sendKeys("12306");
//su是搜索按钮的id
WebElement btn=driver.findElement(By.id("su"));
//点击事件
btn.submit();
//休眠时间
Thread.sleep(3000);
String title = driver.getTitle();
      if((title.compareTo("百度一下, 你就知道"))==0)
          System.out.println("title is correct!!");
      else
          System.out.println("title is error!!"); //关闭页面
driver.close();
} }

7.定位一组对象操作

webdriver使用findElement方法定位一个特定的对象,不过我们有时需定位一组对象, webdriver同样提供了定位一组元素的方法叫findElements。

定位一组对象一般用于如下两个场景:
①批量操作对象,比如将页面上的checkbox都勾选上。
②先获取一组对象,再在这组对象中过滤需要具体定位的一些对象。
代码实现方式多样,可使用for循环,集合列表,多个节点,遍历,迭代器等方式实现,试下部分代码如下,仅供参考:
//单个元素定位
// driver.findElement(By.cssSelector("#web")).click();
// driver.findElement(By.cssSelector("#training")).click();
// driver.findElement(By.cssSelector("#friend")).click();
// driver.findElement(By.cssSelector("#other")).click();
//单个元素for循环定位
// for(int i=1;i<5;i++)
//节点
// driver.findElement(By.cssSelector("div#checkbox > input:nth-of-type("+"i"+")")).click();
//集合
List<WebElement> lt=driver.findElements(By.cssSelector("input[type='checkbox']"));
for(int i=0;i<lt.size();i++)
lt.get(i).click();
Thread.sleep(2000); //for循环遍历
for(WebElement e:lt)
e.click();
Thread.sleep(2000);
//迭代器
Iterator<WebElement> itr=lt.iterator();
while(itr.hasNext())
itr.next().click();
Thread.sleep(2000);
driver.quit();

8.层级定位操作

经常会遇到无法直接定位到需要选取的元素, 但是其父元素比较容易定位, 通过定位父元素再遍历其子元素选择需要的目标元素,或者需要定位某个元素下所有的子元素。层级定位的思想是先定位父对象,然后再从父对象中精确定位出其我们需要选取的后代元素。

以登录百度账号为例,代码实现如下,仅供参考:

 package com.ui.day2;

 import java.util.List;
import java.util.concurrent.TimeUnit; import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver; public class yihuqingjiu_tese_baidu_login { public static void main(String[] args) throws Exception {
System.setProperty("webdriver.chrome.driver","C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
WebDriver driver=new ChromeDriver(); driver.get("https://www.baidu.com");
driver.manage().window().maximize();
//定位登录按钮
//driver.findElement(By.cssSelector("div#u1 a[name='tj_login']")).click();
//列表定位
List<WebElement> list=driver.findElements(By.cssSelector("a[name='tj_login']"));
list.get(1).click();
//需要等待时间,不然定位不到
Thread.sleep(1000);
driver.findElement(By.id("TANGRAM__PSP_10__userNameWrapper")).findElement(By.id("TANGRAM__PSP_10__userName")).sendKeys("223456789@qq.com");
//Thread.sleep(1000);
driver.findElement(By.id("TANGRAM__PSP_10__passwordWrapper")).findElement(By.id("TANGRAM__PSP_10__password")).sendKeys("1234567890"); } }

9.定位frame中对象操作

在web应用中经常会出现frame嵌套的应用,假设页面上有A,B两个frame,其中B在A内,那么定位B中的内容则需要先到A,再到B。switchTo().frame方法可以把当前定位的主题切换到frame里,在frame里实际是嵌套了另外一个页面,而webdriver每次只能在一个页面识别,所以需要用switchTo().frame方法去获取frame中嵌套的页面。
代码实现以禅道提Bug中的重现操作步骤为例,仅供参考:
 package com.ui.day1;

 import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver; public class yihuqingjiu_test_demo3_chandao { public static void main(String[] args) throws Exception {
System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
WebDriver driver=new ChromeDriver();
driver.get("http://127.0.0.1/zentao/my/");
driver.manage().window().maximize();
driver.findElement(By.id("account")).sendKeys("admin");
Thread.sleep(1000);
driver.findElement(By.name("password")).sendKeys("123456");
Thread.sleep(1000);
//点击登录
driver.findElement(By.xpath("//button[@id='submit']")).click();
Thread.sleep(2000);
//点击测试
driver.findElement(By.linkText("测试")).click();
Thread.sleep(1000);
//点击Bug
driver.findElement(By.linkText("Bug")).click();
Thread.sleep(1000);
//点击提交Bug
driver.findElement(By.xpath("//a[@href='/zentao/bug-create-5-0-moduleID=0.html']")).click();
Thread.sleep(1000); //重现步骤
//switchTo()从外html文件跳到内html文件中
driver.switchTo().frame(driver.findElement(By.xpath("//div[@class='ke-edit']/iframe")));
WebElement step=driver.findElement(By.xpath("//body[@class='article-content']"));
step.sendKeys(Keys.ARROW_RIGHT);
step.sendKeys(Keys.ARROW_RIGHT);
step.sendKeys(Keys.ARROW_RIGHT);
step.sendKeys(Keys.ARROW_RIGHT);
step.sendKeys("打开禅道");
Thread.sleep(1000);
//step.sendKeys(Keys.ARROW_DOWN);
step.sendKeys(Keys.ARROW_DOWN);
step.sendKeys("不能打开");
Thread.sleep(1000);
step.sendKeys(Keys.ARROW_DOWN);
//step.sendKeys(Keys.ARROW_DOWN);
step.sendKeys("正常打开");
Thread.sleep(1000);
driver.switchTo().defaultContent();
//浏览器拉到最底部
((JavascriptExecutor)driver).executeScript("window.scrollTo(0,document.body.scrollHeight)");
//点击保存按钮
driver.findElement(By.xpath("//button[@id='submit']")).click(); }
}

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弹窗延时用固定等待
实现代码如下,仅供参考:
 package com.ui.day1;

 import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver; public class yihuqingjiu_test_demo_js { public static void main(String[] args) throws Exception {
//chrom浏览器驱动的位置
System.setProperty("webdriver.chrome.driver","C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
//web驱动指向chrom驱动并创建对象driver
WebDriver driver=new ChromeDriver();
//获取网址
driver.get("file:///C:/Users/hongboss/Desktop/js%E4%BB%A3%E7%A0%81/%E5%AF%B9%E8%B1%A1.html?");
//浏览器最大化
driver.manage().window().maximize();
driver.findElement(By.cssSelector("#btn")).click();
Thread.sleep(1000);
Alert alter=driver.switchTo().alert();
Thread.sleep(1000);
System.out.println(alter.getText());
alter.accept();
driver.findElement(By.cssSelector("#btn1")).click();
Thread.sleep(1000);
Alert alter1=driver.switchTo().alert();
Thread.sleep(1000);
System.out.println(alter1.getText());
alter1.dismiss();
driver.findElement(By.cssSelector("#btn2")).click();
Thread.sleep(1000);
Alert alter2=driver.switchTo().alert();
Thread.sleep(1000);
System.out.println(alter2.getText());
alter2.sendKeys("hello");
Thread.sleep(1000);
alter2.accept(); } }

11.下拉框处理

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

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

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

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

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

 package com.ui.day2;

 import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions; public class yihuqingjiu_test_baidu_float { public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
WebDriver driver=new ChromeDriver();
driver.get("https://www.baidu.com");
driver.manage().window().maximize();
//定位更多产品
WebElement move=driver.findElement(By.cssSelector(".bri"));
Actions action=new Actions(driver);
action.moveToElement(move).perform();
//driver.findElement(By.cssSelector(".bdbriimgitem_3")).click();
driver.findElement(By.cssSelector(".bdbriimgitem_6")).click();
} }

12.select菜单处理

实现方法有如下四种:

①鼠标点击事件,move

②层级关系

③list列表

④selector方法

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

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

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

 package com.ui.day1;

 import java.util.List;

 import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver; public class yihuqingjiu_test_demo_list { public static void main(String[] args){
System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
WebDriver driver=new ChromeDriver();
driver.get("https://www.baidu.com/");
driver.manage().window().maximize();
//把列表内容放到list中
List<WebElement> list=driver.findElements(By.cssSelector("a.mnav"));
//Thread.sleep(3000);
//取出列表中的具体值,并点击
list.get(2).click(); } }

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

  selectByIndex(int index)   //通过index

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

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

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

 package com.ui.day1;

 import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.Select; public class yihuqingjiu_test_demo_select { public static void main(String[] args) throws Exception {
System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
WebDriver driver=new ChromeDriver();
driver.get("file:///F:/17new/12%20UI%E8%87%AA%E5%8A%A8%E5%8C%96/html/ui_day1_test.html");
driver.manage().window().maximize();
WebElement selector=driver.findElement(By.id("select"));
Select select = new Select(selector);
select.selectByVisibleText("有经验");
Thread.sleep(2000);
select.selectByValue("无经验");
Thread.sleep(2000);
select.selectByIndex(1); } }

特殊下拉框:

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

 package com.ui.day3;

 import java.util.List;

 import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver; public class yihuqingjiu_test_select_12306 { public static void main(String[] args) throws Exception {
System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
WebDriver driver=new ChromeDriver();
driver.get("https://www.baidu.com/");
driver.manage().window().maximize();
//定位输入框,并输入内容
driver.findElement(By.cssSelector("#kw")).sendKeys("12306");
//点击输入框
driver.findElement(By.cssSelector("#kw")).click();
Thread.sleep(1000);
//把列表内容放到list中
List<WebElement> list=driver.findElements(By.cssSelector("form#form div.bdsug ul li"));
//Thread.sleep(3000);
//取出列表中的具体值,并点击
list.get(1).click(); } }

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)");------------------左右拉到中间

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

  1. MVC中 _ViewStart _Layout Index三个页面中的加载顺序

    MVC学习中忽然想到一个问题.. 在访问一个Index.cshtml页面时, MVC的加载顺序是怎么样的呢? 首先说下我的结论 . _ViewStart.cshtml . Index.cshtml . ...

  2. UI自动化测试(四)AutoIT工具使用和robot对象模拟键盘按键操作

    AutoIT简介 AutoIt 目前最新是v3版本,这是一个使用类似BASIC脚本语言的免费软件,它设计用于Windows GUI(图形用户界面)中进行自动化操作.它利用模拟键盘按键,鼠标移动和窗口/ ...

  3. web页面中可以包含多个对象

    # encoding=utf-8 #python 2.7.10 #xiaodeng #web页面中可以包含多个对象 #HTTP权威指南 10页 #应用程序完成一项任务时通常会发布多个http事务.如: ...

  4. JQuery 根据ID在页面中定位

    1.锚点跳转简介 锚点其实就是可以让页面定位到某个位置上的点.在高度较高的页面中经常见到.比如百度的百科页面,wiki中的page内容. 我知道实现锚点的跳转有两种形式,一种是a标签+name属性:还 ...

  5. 使用 jQuery对象设置页面中 <ul> 元素的标记类型,并使用 DOM 对象设置 <li> 元素的浮动属性和右边距。使用jQuery 对象和 DOM 对象设置页面元素属性

    查看本章节 查看作业目录 需求说明: 使用 jQuery对象设置页面中 <ul> 元素的标记类型,并使用 DOM 对象设置 <li> 元素的浮动属性和右边距.使用jQuery ...

  6. 关于PHP面向对象中—类的定义与对象的实例化操作以及构造、析构函数的特殊用法

    类的定义与对象的实例化操作 <?php //类里面的成员是属于对象的class Hero{    public $name;//成员变量    //成员属性(存在于强类型语言中)    prot ...

  7. struts2中从数据库中读取数据,并在JSP页面中遍历保存有JavaBean对象的List对象

    0x1:前言 前面搭建struts就不说了,大家都能成功完毕. 0x2:Model 这里我们须要一个Model类来接收 <span style="font-size:10px;font ...

  8. [插件] 如何在一个页面中使用多个SWFUpload对象上传文件

    首先需要引入相应的样式和JS文件,还需要借助jQuery的js 提供下载路径:http://pan.baidu.com/s/1EUzca ① 引入js <script type="te ...

  9. Swift中 删除Array的元素对象

    Swift中Array的删除对象 在Swift中数组Array没有removeObject的方法 1.找到下标 let model_index = selectedArray.index(where: ...

随机推荐

  1. iOS 之APP上架

    前几天在忙着上线,尽管之前已经上线过一次,但由于本身比较菜,还是状况百出. 好在今天终于成功提交,因此来写写心得. 如果是第一次上线,推荐这篇文章: http://jingyan.baidu.com/ ...

  2. oracle number型日期转date型日期

    在搞数据库时,发现有这样的一个字段,类型是NUMBER(38),查看了一下里面的数据,都是这样的, 13239576781141321326994295132212930680413221297162 ...

  3. 如何利用OCS缓存TomcatSession全局变量(转)

    转: 首先非常感谢阿里云给我们提供了一个如此省事的平台. 我们公司是一家物流公司,主要提供运输和仓储的服务.我们现在正在把我们的系统往阿里云迁移.当然,还在迁移过程中,所以还有很多是没办法现在说得太清 ...

  4. Qt for Android 程序禁止屏幕旋转

    有时候我们希望让一个程序的界面始终保持在一个方向,不随手机(平板)方向旋转而变化:在AndroidManifest.xml的每一个需要禁止转向的Activity配置中加入 android:screen ...

  5. Careercup - Facebook面试题 - 5177378863054848

    2014-05-02 08:29 题目链接 原题: Write a function for retrieving the total number of substring palindromes. ...

  6. C++程序设计之结构体,共用体,枚举和typedef

    [1]结构体的基本功 注意结构体里面可以有很多东西,可以结构体里面包含结构体 #include<iostream> using namespace std; struct Date { i ...

  7. hadoop命令报错:权限问题

    root用户执行hadoop命令报错: [root@vmocdp125 conf]# hadoop fs -ls /user/ [INFO] 17:50:42 main [RetryInvocatio ...

  8. CentOS修改SSH默认端口

    1. 修改配置文件 vim /etc/ssh/sshd_config 修改 #Port 22 这行,  去掉 #  修改后面的端口号 例如 Port 2123 重启sshd服务 /etc/init.d ...

  9. winsock编程select模型

    winsock编程select模型 网络服务端连接数量过多时,为每一个连接申请一个线程会让机器性能急剧下降(大多说是因为线程在用户态和内核态之间切换会占用大量的CPU时间片).为了解决多线程带来的性能 ...

  10. shell编程(二)

    第三十二次课 shell编程(二) 目录 十五.shell中的函数 十六.shell中的数组 十七.告警系统需求分析 十八.告警系统主脚本 十九.告警系统配置文件 二十.告警系统监控项目 二十一.告警 ...