一、WebDriver API简单元素操作
定位元素之后,需要对元素进行操作,WebDriver中最常用的几个方法如下
(1)、clear()
清除文本输入框的内容
driver.findElement(By.id("idInput")).clear(); //清空输入框内容
登录框内一般会默认有“账号”等提示信息,如果直接向输入框中输入数据,则会和输入框的信息拼接,从而造成输入信息错误,这个时候就可以使用clear()方法来清除输入框中的默认提示信息
(2)、sendKeys(value)
模拟键盘向输入框里输入内容
driver.findElement(By.id("idInput")).sendKeys("username"); //向输入框输入内容
(3)click() 单击元素
click() 方法可以用来单击一个元素,前提是他是一个被单击的对象(图片/文字链接,复选框,单选框,下拉框等)
driver.findElement(By.id("loginBtn")).click(); //点击登录按钮
(4)submit()方法用于提交表单
有时候submit()和click()方法是可以互换来使用,submit()也可以提交一个按钮,但是submit()的应用范围远不及click
driver.findElement(By.id("query")).submit();
(5)getSize() 返回元素的尺寸
getSize 方法用于获取百度输入框的宽、高
WebElement size = driver.findElement(By.id("kw")); //获得百度输入框的尺寸
System.out.println(size.getSize());
(6)getText() 获取元素的文本
getText 方法用于获得百度底部的备案信息
WebElement text = driver.findElement(By.id("cp")); //返回百度页面底部备案信息
System.out.println(text.getText());
(7)getAttribute(name) 获得属性值
getAttribute()用于获得百度输入的 type 属性的值
WebElement ty = driver.findElement(By.id("kw")); //返回元素的属性值,可以是 id、name、type 或元素拥有的其它任意属性
System.out.println(ty.getAttribute("type"));
getAttribute(“innerHTML”):DOM对象的属性,不是元素标签的属性。
比如度首页的设置标签a,取值是a标签的子标签,包括html里面的代码,就是设置两个字
String attribute = driver.findElement(By.id("s-usersetting-top")).getAttribute("innerHTML");
如下代码则表示获取所有html中的对象属性,会在一些元素是不可用或不可用的的状态下,通过鼠标等操作属性才可用或可见,这样我们就定位不到元素了,这时候就需要用到如下代码去找到元素
String attribute = driver.findElement(By.xpath("//html")).getAttribute("innerHTML");
getAttribute(“value”):取输入框里面的值
//获取百度输入框里面的值
String attribute = driver.findElement(By.id("kw")).getAttribute("value");
思考题:如何判断一个按钮是否是灰的
定位xpath后,getAttribute取class包含disable
boolean attribute = driver.findElement(By.linkText("<上一页")).getAttribute("class").contains("disabled");
(8)isDisplayed() 设置该元素是否用户可见
isDisplayed()用于判断某个元素是否存在在页面上(是否可见),如果可见则返回 True,否则返回 False。
某些情况元素的visibility为hidden或者display属性为none,我们在页面看不到但是实际是存在页面的一些元素)
WebElement display = driver.findElement(By.id("kw")); //返回元素的结果是否可见,返回结果为 True 或 False
System.out.println(display.isDisplayed());
(9)、isEnable:判断元素是否可用(可编辑不置灰)
用于存储input、select等元素的编辑状态,可编辑返回true,否则返回false;也可以使用getAttribute(“class”)
WebElement display = driver.findElement(By.id("kw")); //返回元素的结果是否可见,返回结果为 True 或 False
System.out.println(display.isEnable());
(10)、isSelected()
判断某个元素是否被选中
二、WebDriver API复杂元素操作
(一)、鼠标事件
可以使用click()来模拟鼠标的单击操作,Web产品中提供了更丰富的鼠标交互方式;如右击,双击,悬停等功能,在WebDriver中,将这些关于鼠标操作的方法封装在Actions类中
Actions类提供了鼠标操作的常用方法
1、ContextClick():右击
//(1)鼠标右键点击指定的元素 contextClick()
Actions action = new Actions(driver); // Actions(driver) 调用 Actions()类,将浏览器驱动 driver 作为参数传入。
action.contextClick(driver.findElement(By.id("su"))).perform();
//contexClick(xxx) context_click()方法用于模拟鼠标右键操作,在调用时需要指定元素定位。
//perform()执行所有 ActionChains 中存储的行为,可以理解成是对整个操作的提交动作。
2、clickAndHold():模拟鼠标点击并控制的动作
鼠标悬停弹出下拉框
//鼠标悬停 clickAndHold()
Actions action = new Actions(driver);
action.clickAndHold(driver.findElement(By.linkText("设置"))).perform();
3、doubleClick():双击
//鼠标双击 doubleClick()
Actions action = new Actions(driver);
action.doubleClick(driver.findElement(By.name("element"))).perform();
4、dragAndDrop():拖动
dragAndDrop(source,target):在源元素上按下鼠标左键,然后移动到目标元素上释放
source:鼠标拖动的源元素。
target:鼠标释放的目标元素。
//(4)鼠标拖动 dragAndDrop(source,target)
Actions action = new Actions(driver);
WebElement source = driver.findElement(By.name("element"));
WebElement target = driver.findElement(By.name("element"));
action.dragAndDrop(source,target).perform(); // 鼠标拖拽动作,将 source 元素拖放到 target 元素的位置。
5、release():释放鼠标
6、perform():执行所有Actions中存储的行为
//(5)释放鼠标 release()
Actions action = new Actions(driver);
action.release().perform();
(二)、键盘事件
// Keyboard.java
package com.mypro.jase;
import org.openqa.selenium.Keys; // 在使用键盘按键方法前需要先导入 keys 类
.............
public class keyboard {
public static void main(String[] args){
WebDriver driver = new ChromeDriver();
driver.get("http://www.baidu.com");
WebElement input = driver.findElement(By.id("kw"));
input.sendKeys("seleniumm"); //输入框输入内容"seleniumm"
input.sendKeys(Keys.BACK_SPACE); //删除多输入的一个 m;
input.sendKeys(Keys.SPACE); //输入空格键+“教程”;
input.sendKeys("教程");
input.sendKeys(Keys.TAB); //输入制表符
input.sendKeys(Keys.CONTROL,"a"); //ctrl+a 全选输入框内容;
input.sendKeys(Keys.CONTROL,"x"); //ctrl+x 剪切输入框内容;
input.sendKeys(Keys.CONTROL,"v"); //ctrl+v 粘贴内容到输入框;
input.sendKeys(Keys.ENTER); //通过回车键盘来代替点击操作;
driver.quit();
}
}
(三)、获得验证信息
在自动化用例执行完成之后,我们可以从页面上获取一些信息来“证明” 用例执行是成功还是失败。
通常用得最多的几种验证信息分别是 title 、URL 和 text。text 方法在前面已经讲过,它用于获取标签对之间的文本信息
getText() :获取元素的文本;
package com.mypro.jase;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class titleRul {
public static void main(String[] args){
WebDriver driver = new ChromeDriver();
driver.get("http://www.126.com");
System.out.println("Before login================");
//获取当前的 title 和 url
System.out.println("title of current page is: " + driver.getTitle());
System.out.println("url of current page is ;" + driver.getCurrentUrl());
//登录 126 邮箱
driver.findElement(By.id("idInput")).clear();
driver.findElement(By.id("idInput")).sendKeys("testingwtb");
driver.findElement(By.id("pwdInput")).clear();
driver.findElement(By.id("pwdInput")).sendKeys("a123456");
driver.findElement(By.id("loginBtn")).click();
System.out.println("After login================");
//获取当前的 title 和 url
System.out.println("title of current page is ;" + driver.getTitle());
System.out.println("url of current page is ;" + driver.getCurrentUrl());
//获得登录用户名
String text = driver.findElement(By.id("spnUid")).getText();
System.out.println(text);
driver.quit();
}
}
(四)、设置元素等待
当浏览器在加载页面时,页面上的元素可能并不是同时被加载完成的,这给元素的定位增加了困难。如果因为在加载某个元素时延迟而造成元素定位失败的情况,那么就会降低自动化脚本的稳定性。我们可以通过设置元素等待提高这种问题而造成的不稳定。
1、timeouts 方法
A、implicitlyWait
识别对象时的超时时间。过了这个时间如果对象还没找到的话就会抛出NoSuchElement 异常。
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
B、setScriptTimeout
异步脚本的超时时间。WebDriver 可以异步执行脚本,这个是设置异步执行脚本脚本返回结果的超时时间。
driver.manage().timeouts().setScriptTimeout(3, TimeUnit.SECONDS);
C、pageLoadTimeout
页面加载时的超时时间。因为 WebDriver 会等页面加载完毕再进行后面的操作, 所以如果页面超过设置时间依然没有加载完成,那么 WebDriver 就会抛出异常;
driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);
2、sleep 休眠方法
有时间我们希望脚本执行到某一位置时做固定时间的休眠,尤其是在脚本调试的过程中。那么可以使用Java 提供的 Thread.sleep(2000)方法;当执行到 sleep()方法时会固定的休眠所设置的时长(这里以毫秒为单位);然后再继续执行。
public static void main(String[] args){
WebDriver driver = new ChromeDriver();
driver.get("http://www.baidu.com/");
try { //必须异常处理
Thread.sleep(2000) ;
} catch (InterruptedException e) {
e.printStackTrace();
}
driver.findElement(By.id("kw")).sendKeys("selenium");
driver.findElement(By.id("su")).click();
try { //必须异常处理
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
driver.quit();
}
更多元素操作方法请到参考官网的API:https://seleniumhq.github.io/selenium/docs/api/java