zoukankan      html  css  js  c++  java
  • Selenium 定位元素原理,基本API,显示等待,隐式等待,重试机制等等

    Selenium  如何定位动态元素:

    测试的时候会遇到元素每次变动的情况,例如:

    <div id="btn-attention_2030295">...</div>

    这个id 可能每次都不同,所以如何定位到该类元素呢?

    1. 根据其他属性定位

    如果有其他固定属性,最先考虑的当然是根据元素的其他属性来定位,定位方式那么多,何必在这一棵树上吊死。。

    2.根据相对关系定位

    根据其附近的父节点、子节点、兄弟节点定位,关于这方面,博主之前的一篇文章可作为参考:Python selenium —— 父子、兄弟、相邻节点定位方式详解

    3.根据DOM顺序index定位

    这个很简单,找到该元素在主文档或某级父节点中的index,然后根据index可轻松定位,不过这种方式可能不够稳定,如果可以,还是用其他的方法定位更加合适。

    4.根据部分元素属性定位

    xpath中提供了三个非常好的方法来为我们定位部分属性值:

    driver.find_element_by_xpath("//div[contains(@id, 'btn-attention')]")
    driver.find_element_by_xpath("//div[starts-with(@id, 'btn-attention')]")
    driver.find_element_by_xpath("//div[ends-with(@id, 'btn-attention')]")  # 这个需要结尾是‘btn-attention’

    Selenium 显式等待与隐式等待:

    在selenium中(appium通用)常用的等待分为显示等待WebDriverWait()隐式等待implicitly_wait()强制等待sleep()三种,下面我们就分别介绍一下这三种等待的区别

    • sleep(): 强制等待,设置固定休眠时间。 python 的 time 包提供了休眠方法 sleep() , 导入 time 包后就可以使用 sleep(),进行脚本的执行过程进行休眠。
    • implicitly_wait():隐式等待,也叫智能等待,是 webdirver 提供的一个超时等待。隐的等待一个元素被发现,或一个命令完成。如果超出了设置时间的则抛出异常。
    • WebDriverWait():显式等待,同样也是 webdirver 提供的方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。默认检测频率为0.5s,默认抛出异常为:NoSuchElementException

    #添加智能等待
    driver.implicitly_wait(30)               #implicitly_wait()方法比 sleep() 更加智能,后者只能选择一个固定的时间的等待,前者可以在一个时间范围内智能的等待
    driver.find_element_by_id("su").click()

    public boolean isByElementDisplayed(By by, int time) {
        boolean status = false;
        if (driver.findElement(by).isDisplayed() == false) {
            driver.manage().timeouts().implicitlyWait(time, TimeUnit.SECONDS);
        } else {
            status = true;
        }
        return status;
    }


    #添加固定休眠时间
    sleep(5)                     #sleep()方法以秒为单位,假如休眠时间小时 1 秒,可以用小数表示。
    driver.quit()

    关于强制等待和隐式等待在上面注释中已做了说明

    下面主要介绍一下WebDriverWait() 显示等待,语法格式如下:

    python实例:
    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.common.exceptions import NoAlertPresentException,TimeoutException,NoSuchElementException
    driver=webdriver.Firefox()
    driver.get("http:www.baidu.com")
    WebDriverWait(driver,10,1,NoSuchElementException).until(lambda driver:driver.find_element_by_name("d_status")) 
    WebElement e = (new WebDriverWait( driver, 10)) .until(
        new ExpectedCondition< WebElement>(){  //等10秒直到找到id元素
            @Override
            public WebElement apply( WebDriver d) {
                return d.findElement( By.id("id locator"));
            }
        }
    );

    Selenium  基本API

    参考: https://www.cnblogs.com/fnng/p/3968009.html

    Open Browser

    Close Browser  Close All Browsers

    Maximize Browser Window

    Get Window Size

     富文本编辑框推荐使用Js 

     String text = "你好呀";
                 String js = "document.getElementById('ueditor_0').contentDocument.write('" + text + "');";
                 ((JavascriptExecutor) driver).executeScript(js);

    Testng 失败后重试:

    https://www.cnblogs.com/testway/p/6118148.html

    xpath定位:

    定位路径可以是相对路径,也可以是绝对路径。绝对定位路径以一个斜线“/”开头,而相对定位路径则没有。如:/div/input 和 div/input

       第一种方法:通过绝对路径做定位

    By.xpath("html/body/div/form/input")
    By.xpath("//input")
    第二种方法:通过元素索引定位
    By.xpath("//input[4]")
    第三种方法:使用xpath属性定位(结合第2、第3中方法可以使用),前面用:tagName [@ 属性='属性值'] 表示
    By.xpath("//input[@id='kw1']")
    By.xpath("//input[@type='name' and @name='kw1']")
    第四种方法:使用部分属性值匹配(最强大的方法)
    By.xpath("//input[start-with(@id,'nice')
    By.xpath("//input[ends-with(@id,'很漂亮')
    By.xpath("//input[contains(@id,'那么美')]")

                

  • 相关阅读:
    用Fragment实现如新浪微博一样的底部菜单的切换
    Android基础之使用Fragment控制切换多个页面
    Android_Fragment_Fragment详解
    android下拉菜单spinner的使用方法
    eclipse / ADT(Android Develop Tool) 一些方便的初始设置
    Android Studio如何设置代码自动提示
    <交流贴>android语音识别之科大讯飞语音API的使用
    原 [Android]LIstView的HeaderView
    001 Java 深拷贝、浅拷贝及Cloneable接口
    GenericServlet与HttpServlet
  • 原文地址:https://www.cnblogs.com/Ronaldo-HD/p/9848838.html
Copyright © 2011-2022 走看看