zoukankan      html  css  js  c++  java
  • selenium常用操作之等待操作

    页面自动化中,不得不提的元素等待操作,selenium为我们提供了三大等待方式:强制等待、隐性等待和显性等待

    1.强制等待:time.sleep(秒)     

    如果使用time.sleep(10)表示让程序死等10秒钟,无论发生什么都会在10秒后再去执行后续的代码。 

    智能等待分为:隐性等待、显性等待

    2.隐式等待:implicitly_wait(20)  

      全局设置一次(与显性等待不同)

      隐形等待元素不一定是可见的(与显性等待不同)

      智能等待的隐形等待:会话开始之后使用隐形等待,之后整个会话周期内所有的找元素都会调用隐形等待,等待元素可见,等待命令执行,全局都可用

    复制代码
    from selenium import webdriver
    
    # 打开谷歌浏览器,建立会话。启动Chromedriver.exe  打开Chrome
    driver = webdriver.Chrome()
    
    # 智能等待的隐形等待:会话开始之后使用隐形等待,之后所有的找元素都会调用隐形等待,等待元素可见,等待命令执行
    # implicitly_wait(译:隐婆思类.威特)
    driver.implicitly_wait(20)
    
    # 访问百度首页
    driver.get("http://www.baidu.com")
    # 点击登录按钮
    driver.find_element_by_xpath('//div[@id="u1"]//a[@name="tj_login"]').click()
    # 点击 用户名登录 按钮
    driver.find_element_by_id("TANGRAM__PSP_10__footerULoginBtn").click()
    # 关闭浏览器
    driver.quit()
    复制代码

    3.显性等待:他有非常多的条件

    与隐形等待的不同;可以处理很多中情况如:

    • 等待元素可见
    • 等待元素可用
    • 等待新窗口出现
    • 等待 url地址=xxx的时候
    • 等待 的上限是多少秒,每隔0.5秒去查看条件是否成立
    • 明确等到某个条件满足之后,再去执行下一步操作。
    • 程序每隔xx秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到等待的元素可见
    • 超过设置的最长时间,然后抛出TimeoutException. --- .
    • WebDriverWait类:显性等待类。
      • WebDriverWait(driver,等待时长,轮循周期).until()/until_ not()  
    • expected_ conditions模块: 提供了-系列期望发生的条件。

    什么时候用?

    • 当你的操作,引起了页面的变化,而你接下来要操作变化 的元素的时候,就一定要加等待。

    1.使用之前,引入相关的库

    • from selenium.webdriver.support.wait import WebDriverWait
    • from selenium.webdriver.support import expected_conditions as EC
    • from selenium.webdriver.common.by import By

    使用方法:

    2、确定元素的定位表达式
    web_ locator = 'XXXX'

    3、调用webdriverWait类设置等待总时长、轮询周期。并调用期until、until_ not方法。
    WebDriverWait(webdriver对象名,等待总时长,轮询周期),until(判断条件)

    4、使用expected_ conditions对 应的方法来生成判断条件。
    EC.类名((定位方式、定位表达式))
    例: EC.presence_ of_ element_ located((By.CSS_ SELECTOR,web locator)))

    例:等待百度登陆的弹出框出现,再去操作弹出框。

    复制代码
    # 使用之前,引入相关的库
    from selenium.webdriver.support.wait import WebDriverWait               # 等待条件
    from selenium.webdriver.support import expected_conditions as EC        # 等待元素可见的条件
    from selenium.webdriver.common.by import By                             # 定位类型八种定位方式
    from selenium import webdriver
    
    
    # 打开谷歌浏览器,建立会话。启动Chromedriver.exe  打开Chrome
    driver = webdriver.Chrome()
    
    # 访问百度首页
    driver.get("http://www.baidu.com")
    # 点击登录按钮
    driver.find_element_by_xpath('//div[@id="u1"]//a[@name="tj_login"]').click()
    
    # 等待元素 id=TANGRAM__PSP_10__footerULoginBtn 可见。等待上限是10秒。直到 条件可见
    loc = (By.ID, "TANGRAM__PSP_10__footerULoginBtn")
    # EC.visibility_of_element_located(loc)  # 等待元素可见的条件
    # until 直到什么什么
    WebDriverWait(driver, 10, 0.5).until(EC.visibility_of_element_located(loc))
    
    # 点击 用户名登录 按钮
    driver.find_element_by_id("TANGRAM__PSP_10__footerULoginBtn").click()
    # 关闭浏览器
    driver.quit()



    以下是列举expected_conditions模块中常用的条件类:

    这两个条件类验证title,验证传入的参数title是否等于或包含于driver.title
    title_is
    title_contains

    这两个人条件验证元素是否出现,传入的参数都是元组类型的locator,如(By.ID, 'kw')
    顾名思义,一个只要一个符合条件的元素加载出来就通过;另一个必须所有符合条件的元素都加载出来才行
    presence_of_element_located
    presence_of_all_elements_located

    这三个条件验证元素是否可见,前两个传入参数是元组类型的locator,第三个传入WebElement
    第一个和第三个其实质是一样的
    visibility_of_element_located
    invisibility_of_element_located
    visibility_of

    这两个人条件判断某段文本是否出现在某元素中,一个判断元素的text,一个判断元素的value
    text_to_be_present_in_element
    text_to_be_present_in_element_value

    这个条件判断frame是否可切入,可传入locator元组或者直接传入定位方式:id、name、index或WebElement
    frame_to_be_available_and_switch_to_it

    这个条件判断是否有alert出现
    alert_is_present

    这个条件判断元素是否可点击,传入locator
    element_to_be_clickable

    这四个条件判断元素是否被选中,第一个条件传入WebElement对象,第二个传入locator元组
    第三个传入WebElement对象以及状态,相等返回True,否则返回False
    第四个传入locator以及状态,相等返回True,否则返回False
    element_to_be_selected
    element_located_to_be_selected
    element_selection_state_to_be
    element_located_selection_state_to_be

    最后一个条件判断一个元素是否仍在DOM中,传入WebElement对象,可以判断页面是否刷新了
    staleness_of


    上面是所有17个condition,与until、until_not组合能够实现很多判断,如果能自己灵活封装,将会大大提高脚本的稳定性。

  • 相关阅读:
    HDU 1402 A * B Problem Plus (FFT)
    CodeForces 935E Fafa and Ancient Mathematics (树形DP)
    HDU 5355 Cake (构造 + 暴力)
    HDU 5360 Hiking (贪心)
    Java高阶回调,回调函数的另一种玩法
    关于git 指令
    Retrofit2 完全解析 探索与okhttp之间的关系
    HTTP中GET与POST的区别
    TCP,IP,HTTP,SOCKET区别和联系
    android 实现类似qq未读消息点击循环显示
  • 原文地址:https://www.cnblogs.com/123blog/p/12475789.html
Copyright © 2011-2022 走看看