selenium 基础知识

元素定位

selenium中一共有八种定位方式

  1. id定位::根据元素的id进行定位,id在一个页面需要保持唯一,如果id不唯一则会获取到最第一个出现的id元素

  2. name  :根据元素的name值进行定位,

  3. class   :根据元素的class进行定位,一个元素中有多个class时,只要其中一个class名称满足条件就会被定位到。当页面上有多个同名class时则会定位到一组元素

  4. tag      :根据元素的tag名称进行定位,就是html中标签名,如body、input、button、table,div,.....等

  5. link      :专门用来定位文本链接,需要完全匹配才能定位成功

  6. partial link :是对link定位的补充,只需要文本链接的一部分就能定位

  7. xpath  :XPath 有多种定位策略,最简单直观的就是写出元素的绝对路径

  8. 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有关联的窗口

posted @ 2019-06-17 18:38  運命の出会い  阅读(232)  评论(0编辑  收藏  举报