• python-web自动化-三种等待方式(元素定位不到一)


    python-web自动化-三种等待方式

     

    当有元素定位不到时,比如下拉框,弹出框等各种定位不到时;
    一般是两种问题:1 、有frame ;2、没有加等待


    下面学习三种等待方式:

    1.强制等待 sleep(xx)
    这种方法简单粗暴,不管浏览器是否加载完,程序都要等待规定的xx时间,时间到了才继续执行下面的代码。
    不建议总是用这种等待方式,会严重影响程序的执行速度。

    1
    2
    3
    4
    5
    6
    7
    8
    # -*- coding:utf-8 -*-
    from selenium import webdriver
    from time import sleep
    driver = webdriver.Chrome()
    driver.get('https://www.baidu.com/')
    sleep(3)#强制性等待3s再执行以下代码
    print(driver.current_url)
    driver.quit()#退出驱动,关闭所有窗口

      

    2.隐性等待 implicitly_wait(xx)
    这种方法是设置一个最长的等待时间,如果在规定时间内网页全部元素加载完成,则执行下一步,否则一直等待时间截止才执行下一步。比强制性等待智能些
    !隐性等待对整个driver的周期都起作用,所以只要设置一次即可

    1
    2
    3
    4
    5
    6
    7
    # -*- coding:utf-8 -*-
    from selenium import webdriver
    driver = webdriver.Chrome()
    driver.get('https://www.baidu.com/')
    driver.implicitly_wait(30)#隐性等待,最长30s
    print(driver.current_url)
    driver.quit()

      

    3.显性等待 WebDriverWait
    WebDriverWait配合该类的until()和until_not()方法,根据条件灵活的等待
    程序每隔xx秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException。

    A. 使用前,先引用相关库

    B. 确定元素的定位表达式

    C.  使用expected_conditions对应的方法来生成判断条件

    WebDriverWait(driver,10,1).until(EC.visibility_of_element_located((By.ID,ele_locator)))
    WebDriverWait(driver,10,1).until(EC.visibility_of_element_located((By.XPATH,ele_locator)))

    D.  调用WebDriverWait类设置等待总时长、轮询周期

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # -*- coding:utf-8 -*-
    #A. 使用前,先引用相关库
    from selenium import webdriver
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
     
    driver = webdriver.Chrome()#打开Chrome浏览器
    driver.get('https://www.baidu.com/')#打开百度
    driver.find_element_by_xpath('//div[@id="u1"]//a[@name="tj_login"]').click()#点击【登录】;click() 方法,可模拟在按钮上的一次鼠标单击。
    # B. 确定元素的定位表达式
    ele_locator = "TANGRAM__PSP_10__footerULoginBtn"#通过id,确定‘用户名登录’元素
     
    # C.  使用expected_conditions对应的方法来生成判断条件
    # EC.方法名(定位方式,定位表达式)
    # EC.visibility_of_element_located(By.ID,ele_locator)#元素可见
     
    # D.  调用WebDriverWait类设置等待总时长、轮询周期
    # WebDriverWait(driver, 超时时长, 调用频率(默认0.5s)).until(可执行方法, 超时时返回的信息)
    # 等待10秒钟,每隔1秒去查看对应的元素是否可见;如果可见,继续下一步操作;如果不可见,则继续等待,直到10s结束,如果元素还是不可见,则抛出超时异常
    WebDriverWait(driver,10,1).until(EC.visibility_of_element_located((By.ID,ele_locator)))
    1
    2
    3
    driver.find_element_by_id('TANGRAM__PSP_10__footerULoginBtn').click()#点击【用户名登录】
     
    driver.quit()#退出会话
    #driver.close()#关闭窗口
  • 相关阅读:
    UCenter创始人、Discuz!创始人、Discuz!管理员账号区别
    Linux命令:ps ef |grep java
    ASP.NET结合数据库,发送邮件找回密码
    NET中Eval()方法大全
    必将改变Web的五大技术
    为DataGridTextColumn设置表头样式和单元格样式
    string to float
    .net之生成图表的控件(柱状图,曲线图,饼状图) [转]
    判断一个string是否可以为数字
    从零开始做一个开源项目 学习笔记
  • 原文地址:https://www.cnblogs.com/bao-yan/p/12430995.html
Copyright © 2020-2023  润新知