zoukankan      html  css  js  c++  java
  • WebDriverWait元素等待和全局设置

    由于现在部分web应用加载方式的选择,页面会需要一定时间逐渐加载完毕,也就是说有的页面元素先加载出来,有的元素后加载出来。如果直接定位所查找的元素的话,可能会由于此元素尚未加载完毕找不到元素从而报错,由于网络不稳定这种情况出现的几率会大很多,一般解决方法的话,time.sleep()函数可以避免一些这种状况,但是缺少了灵活性。在selenium中有关于等待的方法可以比较灵活的解决这个问题,这次主要讲解selenium中元素等待WebDriverWait的使用,以及全局的设置。
    
    一、关于全局设置超时时间
    三个全局设置时间的方法中,设置的时间单位为秒,例如implicitly_wait(30),意思是超过30秒没有定位到一个元素,程序就会报错抛出异常,期间会一直轮询查找定位元素。
    
    设置全局元素查找的超时时间
    
    implicitly_wait(time_to_wait)
    time_to_wait:超时时间(秒)
    设置全局js异步脚本超时时间
    
    set_script_timeout(time_to_wait)
    time_to_wait:超时时间(秒)
    设置全局页面载入超时时间
    
    set_page_load_timeout(time_to_wait)
    time_to_wait:超时时间(秒)
    二、关于WebDriverWait的使用以及方法介绍(显示等待)
    个人理解:WebDriverWait可以当做元素等待,灵活的设置查找元素时的判断条件,同时由于方法中包含了大量webdriver自带的判断方法,只返回True和False,所以个人认为也可以灵活的当做断言来使用。
    
    2.1基础格式(webDriverWait+until+(判断条件)):
    这个格式的结构有点像语言中主谓宾的结构,实例的意思是程序每0.5秒检查,是否满足:标题包含“百度一下”这个条件,检查是否满足条件的最长时间为:15秒,超过15秒仍未满足条件则抛出异常
    
    WebDriverWait(driver, 15, 0.5).until(expected_conditions.title_contains("百度一下"))
    2.2导入库
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions
    2.3WebDriverWait
    满足条件后继续执行,否则在设置时间过后抛出异常
    
    WebDriverWait(driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None)
    
    driver 所创建的浏览器driver
    timeout 最长时间长度(默认单位:秒)
    poll_frequency 间隔检测时长(每)默认0.5秒
    ignored_exceptions  方法调用中忽略的异常,默认只抛出:找不到元素的异常
    2.4 until / until_not
    直到调用的方法返回值为True
    
    until(method, message='')
    
    method:expected_conditions库中定义的方法
    message :自定义报错信息
    直到调用的方法返回值为False
    
    until_not(method, message='')
    
    method:expected_conditions库中定义的方法
    message :自定义报错信息
    2.5 expected_conditions库中的方法

    1.title_is:判断当前页面的title是否完全等于预期字符串,返回布尔值

    
    

    2.title_contains:判断当前页面的title是否包含预期字符串,返回布尔值

    
    

    3.presence_of_element_located:判断某个元素是否被加到dom树下,不代表该元素一定可见

    
    

    4.visibility_of_element_located:判断某个元素是否可见,可见代表元素非隐藏,并且元素的宽和高都不为0

    
    

    5.visibility_of:跟上面的方法是一样的,只是上面需要传入locator,这个方法直接传定位到的element就好

    
    

    6.presence_of_all_elements_located:判断是否至少一个元素存在于dom树中,举个例子,如果页面上有n个元素的class都是'coumn-md-3',name只要有一个元素存在,这个方法就返回True

    
    

    7.text_to_be_present_in_element:判断某个元素中的text文本是否包含预期字符串

    
    

    8.text_to_be_present_in_element_value:判断某个元素中的value属性值是否包含了预期字符串

    
    

    9.frame_to_be_availabe_and_switch_to_it:判断该frame是否可以switch进去,如果可以,则返回True并且switch进去,否则返回False

    
    

    10.invisibility_of_element_located:判断某个元素是否不存在于dom树或不可见

    
    

    11.element_to_be_clickable:判断某个元素是见并且是enable(有效)的,这样的话才叫clickable

    
    

    12.staleness_of:等某个元素从dom树下移除,返回True或False

    
    

    13.element_to_be_selected:判断某个元素是否被选中,一般用于select下拉表

    
    

    14.element_selection_state_to_be:判断某个元素的选中状态是否符合预期

    
    

    15.element_located_selection_state_to_be:跟上面的方法一样,只是上面的方法传入定位到的element,这个方法传入locator

    
    

    16.alert_is_present:判断页面上是会否存在alert

     
    三、实例展示:全局设置元素定位超时时间 全局设置只需要一行代码,这里为了演示,分别在设置前和设置后分别定位一次元素,元素本身不存在,用来模拟网络波动导致尚未加载出来的状态;然后统计这两次定位所需的时间,发现直接定位只有一次,如果找不到就直接抛出异常了,设置定位超时时间后,在这个时间段内会一直来查找元素。 

    from selenium import webdriver import datetime
    driver
    = webdriver.Chrome()
    driver.get(
    "https://tieba.baidu.com")

    # 未定义全局等待时,直接定位元素
    start1 = datetime.datetime.now()
    try:
    # 使用一个不存在的元素,模拟还没有加载出来的状态
    driver.find_element_by_css_selector("aaaa[title = '娱乐明星']").click()
    except:
      print("没有定位到元素") end1 = datetime.datetime.now()
      print("设置前等待时间: %s 秒" % (end1-start1).total_seconds())
    # 设置全局等待后,再进行定位元素
    driver.implicitly_wait(10) start2 = datetime.datetime.now()
    try:
      driver.find_element_by_css_selector(
    "aaaa[title = '娱乐明星']").click()
    except:
      print("没有定位到元素") end2 = datetime.datetime.now()
      print("设置后等待时间: %s 秒" % (end2-start2).total_seconds())

    运行结果: 没有定位到元素 设置前等待时间:
    0.015992 秒 没有定位到元素 设置后等待时间: 10.045907
    四、实例展示:WebDriverWait返回类型以及抛出异常
    这里主要展示下WebDriverWait中,大部分的返回类型是TrueFalse,部分方法,
    例如presence_of_element_located返回类型为一个元素,我们可以定位元素之后,直接对返回的元素进行click、send_keys等操作。

    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as Expect
    driver
    = webdriver.Chrome() driver.get("https://tieba.baidu.com")
    # 部分关于元素定位的判断返回类型为:元素
    assert_ele = WebDriverWait(driver, 15, 0.5).until(Expect.presence_of_element_located(("id", "wd1"))) assert_ele.send_keys("测试") print("返回类型 %s" % assert_ele)
    # 大部分方法返回类型为TrueFalse assert_judge = WebDriverWait(driver, 15, 0.5).until_not(Expect.title_is("网易"))
    print("返回类型 %s" % assert_judge)
    # 判断失败后会报错 assert_judge = WebDriverWait(driver, 5, 0.5).until(Expect.title_is("网易"), "错误信息:网页标题不是网易")
    运行结果:
    返回类型
    <selenium.webdriver.remote.webelement.WebElement (session="961ec35d6f354c9b5ca65a80cd096104", element="0.5643114406724057-1")>
    返回类型 False Traceback (most recent call last): File
    "D:/1git/cenpur_uitest/test_case/demo.py", line 17,
    in <module> assert_judge = WebDriverWait(driver, 5, 0.5).until(Expect.title_is("网易"), "错误信息:网页标题不是网易")
    File
    "C:Users estAppDataLocalProgramsPythonPython35libsite-packagesseleniumwebdriversupportwait.py", line 80,
    in until raise TimeoutException(message, screen, stacktrace) selenium.common.exceptions.TimeoutException: Message:
    原文链接:https://blog.csdn.net/CCGGAAG/article/details/86763952

    ————————————————
    转载原文链接:https://blog.csdn.net/CCGGAAG/article/details/86763952

  • 相关阅读:
    webbrowser获取页面文章指定段落内容
    webbrowser防止弹窗(IE)
    webbrowser模拟手动输入
    WPF加载Winform窗体时 报错:子控件不能为顶级窗体
    FAQs: 我们可以在那里来为我的没有提升管理权限的应用程序存储用户数据?
    Winform中修改WebBrowser控件User-Agent的方法(已经测试成功)
    必应代码搜索 Bing Code Search 安装
    Microsoft Visual Studio Professional 2012 专业版 下载
    vs2012 aspx 没有设计视图了?
    vs2010 Express 下载连接
  • 原文地址:https://www.cnblogs.com/minghong/p/11678199.html
Copyright © 2011-2022 走看看