Selenium之网页等待时间及牛刀小试实战

自动化测试实战之网页等待时间
简介:讲解自动化测试的等待时间

1、为什么需要等待时间--》等系统稳定
网页需要加载对应的资源文件,页面渲染,窗口处理等等

2、自动化测试常用的等待时间
强制等待 : (自己调试代码看效果)
from time import sleep
sleep(5) # 强制等待5秒再执行下一步,缺点是不管资源是不是完成,都必须等待
隐性等待:
driver.implicitly_wait(10) # 隐性等待,最长等10秒
设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步,弊端就是程序会一直等待整个页面加载完成,到浏览器标签栏那个加载圈不再转

注意:对driver起作用,所以只要设置一次即可,没有必要到处设置
显性等待:

WebDriverWait 需要配合 until和until_not,程序每隔N秒检查一次,如果成功,则执行下一步,否则继续等待,直到超过设置的最长时间
from selenium.webdriver.support.wait import WebDriverWait

语法:WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

  • driver:浏览器对象
  • timeout:超时的时长,单位:秒
  • poll_frequency:检查时间,默认0.5秒
    调用方法until(method):直到
  • method:调用EC.presence_of_element_located(element)
    element:通过By类方法进行定位

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


image.png

image.png
显性等待

1、visibility_of_element_located : 判断某个元素是否可见. 可见代表元素非隐藏,并且元素的宽和高都不等于0
2、visibility_of_all_elements_located:判断多个元素是否可见,可见代表元素非隐藏,并且元素的宽和高都不等于0
3、visibility_of :跟上面的方法做一样的事情,只是上面的方法要传入locator,这个方法直接传定位到的element就好了
4、frame_to_be_available_and_switch_to_it : 判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False
5、alert_is_present : 判断页面上是否存在alert
6、element_to_be_selected:判断某个元素是否被选中了,一般用在下拉列表
7、element_to_be_clickable : 判断某个元素中是否可见并且是enable的,这样的话才叫clickable
8、presence_of_element_located: 判断某个元素是否被加到了dom树里,【并不代表该元素一定可见】
9、presence_of_all_elements_located : 等待所有元素存在dom树中【并不代表该元素一定可见】

from selenium import webdriver
from selenium.webdriver.common.by import By
#导包  等待类
from selenium.webdriver.support.ui import WebDriverWait
#导包  判断条件
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()

#跳转网页
driver.get("https://baidu.com")
#第一个参数,传入驱动,第二个参数为最长等待时间,第三个参数为每隔0.5秒检测一次直到找到ID是“kw”的。
ele = WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located((By.ID,"kw")))
ele.send_keys("小D课堂")
print(driver.title)
driver.quit()
显性等待与窗口切换融合

结论: 隐性等待和显性等待可以同时用,等待的最长时间取两者之中的较大者

隐性等待
from selenium import webdriver
import time
# 引入 ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains

#拿到一辆小汽车driver
driver = webdriver.Firefox()
driver.implicitly_wait(5)
#跳转网页
driver.get("https://baidu.com")

#隐性等待,最长等10秒,如果在规定时间内网页加载完成,则执行下一步
print(driver.title)
from selenium import webdriver
import time
# 引入 ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains

from selenium.webdriver.support.ui import WebDriverWait

#等待时间
def get_ele_times(driver,times,func):
    return WebDriverWait(driver,times).until(func)

def login_test():
    # 拿到一辆小汽车driver
    driver = webdriver.Firefox()
    # 跳转网页
    driver.get("https://xdclass.net")
    print(driver.title)
    # time.sleep(3)

    # 获取登录框,只是获取到,没有别的操作
    # login_ele = driver.find_element_by_css_selector(".login > span:nth-child(2)")
    # 触发点击事件
    # ActionChains(driver).click(login_ele).perform()
    #这里为等待时间。抽象为 get_ele_times(driver,times,func)方法
    ele_login = get_ele_times(driver,10,\
                              lambda driver:driver.find_element_by_css_selector(".login > span:nth-child(2)"))
    ele_login.click()

    # 查找输入框,输入账号密码,输入框需要提前清理
    driver.find_element_by_css_selector(".mobienum > input:nth-child(1)").clear()
    driver.find_element_by_css_selector(".mobienum > input:nth-child(1)").send_keys("177xxx")

    driver.find_element_by_css_selector(".psw > input:nth-child(1)").clear()
    driver.find_element_by_css_selector(".psw > input:nth-child(1)").send_keys("xxx")

    # 查找登录按钮
    login_btn_ele = driver.find_element_by_css_selector(".btn").click()

    # 判断是否登录成功,鼠标移动上面,判断弹窗字符
    user_info_ele = driver.find_element_by_css_selector(".avatar_img")
    time.sleep(1)

    # 触发hover事件
    ActionChains(driver).move_to_element(user_info_ele).perform()


    # 获取用户名的元素
    user_name_ele = driver.find_element_by_css_selector(".username")
    print("====测试结果====")
    print(user_name_ele.text)
    name = user_name_ele.text
    if name == "测试账号":
        print("login ok")
    else:
        print("login fail")

    driver.quit()

if __name__ == '__main__':
    login_test()
image.png

image.png

你可能感兴趣的:(Selenium之网页等待时间及牛刀小试实战)