selenium 基础知识
元素定位
selenium中一共有八种定位方式
-
id定位::根据元素的id进行定位,id在一个页面需要保持唯一,如果id不唯一则会获取到最第一个出现的id元素
-
name :根据元素的name值进行定位,
-
class :根据元素的class进行定位,一个元素中有多个class时,只要其中一个class名称满足条件就会被定位到。当页面上有多个同名class时则会定位到一组元素
-
tag :根据元素的tag名称进行定位,就是html中标签名,如body、input、button、table,div,.....等
-
link :专门用来定位文本链接,需要完全匹配才能定位成功
-
partial link :是对link定位的补充,只需要文本链接的一部分就能定位
-
xpath :XPath 有多种定位策略,最简单直观的就是写出元素的绝对路径
-
css :CSS 可以较为灵活地选择控件的任意属性,一般情况下定位速度要比 XPath 快
当一次性定位一个元素以上时使用列表进行接收
List<WebElement> list = driver.findElemnets(By.ClassName("name"));
元素操作
鼠标操作
单击:
element.click();
鼠标悬停:
Actions actions = new Actions(); actions.moveToElement(element).build().perform();
action
Actions 类提供了鼠标操作的常用方法:
-
contextClick() 右击
-
clickAndHold() 鼠标点击并控制
-
doubleClick() 双击
-
dragAndDrop() 拖动
-
release() 释放鼠标
-
perform() 执行所有 Actions 中存储的行为
键盘操作
清空输入框/域:
element.clear();
输入内容:
element.sendKey(value);
执行js:
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].click()", element);
浏览器窗口操作
driver.manage().window().setSize(new Dimension(480, 800)); //设定浏览器窗口大小
driver.manage().window().maximize(); //最大化浏览器
driver.navigate().back(); //执行浏览器后退
driver.navigate().forward(); //执行浏览器前面
driver.navigate().refresh(); //刷新页面
表单切换
在 Web 应用中经常会遇到 frame/iframe 表单嵌套页面的应用,WebDriver 只能在一个页面上对元素识别与
定位,对于 frame/iframe 表单内嵌页面上的元素无法直接定位。这时就需要通过 switchTo().frame()方法将当前定
位的主体切换为 frame/iframe 表单的内嵌页面中
driver.switchTo().frame("tb"); //切换到 iframe(id = "tb") driver.switchTo().defaultContent(); //退回上一级表单
备注:switchTo().frame()默认可以直接取表单的 id 或 name 属性,如果元素没有id或者name属性,则可以通过其他定位方式将这个表单定位到存储为一个WebElement对象,然后将这个对象当做参数传递给switchTo().frame(element);
等待
隐式等待
WebDriver 提供了几种方法来等待元素。
- implicitlyWait。识别对象时的超时时间。过了这个时间如果对象还没找到的话就会抛出
NoSuchElement 异常。
- setScriptTimeout。异步脚本的超时时间。WebDriver 可以异步执行脚本,这个是设置异步执行脚
本脚本返回结果的超时时间。
- pageLoadTimeout。页面加载时的超时时间。因为 WebDriver 会等页面加载完毕再进行后面的操作,
所以如果页面超过设置时间依然没有加载完成,那么 WebDriver 就会抛出异常。
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); //元素定位等待 driver.manage().timeouts().setScriptTimeout(10, TimeUnit.SECONDS);//异步脚本等待 driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS); //页面加载等待
显示等待
指定一个等待条件,和一个最长等待时间10秒,程序会判断在等待时间内条件是否满足,如果满足则返回,如果不满足会继续等待,超过时间就会抛出异常
new WebDriverWait(driver,10).until(ExpectedConditions.visibilityOf(element));
也可以通过传递参数控制程序每隔多长时间去查找一次元素,如果不传默认为500毫秒
new WebDriverWait(driver,10,1000).until(ExpectedConditions.visibilityOf(element));
自定义等待
有些时候显示等待并不能满足我们的需求,因此需要用到自定义等待,根据返回值判断是否通过等待,ture为通过等待
new WebDriverWait(driver, waiting_time).until(new ExpectedCondition<Boolean>() { @Override public Boolean apply(WebDriver input) {
return false; } });
断言
assertEqual(a, b, [msg='测试失败时打印的信息']) # a == b 断言a和b是否相等,相等则测试用例通过 assertNotEqual(a,b,[msg='测试失败时打印的信息']) # a != b 断言a和b是否相等,不相等则测试用例通过 assertTrue(x,[msg='测试失败时打印的信息']) # x is True 断言x是否True,是True则测试用例通过 assertFalse(x,[msg='测试失败时打印的信息']) # x is False 断言x是否False,是False则测试用例通过 assertIn(a,b,[msg='测试失败时打印的信息']) # a in b 断言a是否在b中,在b中则测试用例通过 assertNotIn(a,b,[msg='测试失败时打印的信息']) # a not in b 断言a是否在b中,不在b中则测试用例通过 assertIsNone(x,[msg='测试失败时打印的信息']) # x is None 断言x是否None,是None则测试用例通过 assertIsNotNone(x,[msg='测试失败时打印的信息']) # x not is None 断言x是否None,不是None则测试用例通过 assertIs(a,b,[msg='测试失败时打印的信息']) # a is b 断言a是否是b,是则测试用例通过 assertNotIs(a,b,[msg='测试失败时打印的信息']) # a not is b 断言a是否是b,不是则测试用例通过 assertIsInstance(a,b,[msg='测试失败时打印的信息']) # 断言a是b的一个实例,是则测试用例通过 assertNotIsInstance(a,b,[msg='测试失败时打印的信息']) # 断言a是b的一个实例,不是则测试用例通过
关闭浏览器
driver.close(); //关闭浏览器
driver.quit(); //退出浏览器
区别:close方法为关闭当前窗口,如果该driver存在多个窗口则不会全部关闭
quit方法为关闭所有与这个driver有关联的窗口