web笔记-2

'''强制等待'''
import time

'''为什么要添加等待'''
#避免页面未渲染完成后操作,导致的报错

'''直接(强制)等待'''
#time.sleep()
#解决方案:在报错的元素操作之前添加等待
#原理:强制等待,线程休眠一定时间
#弊端1:不确定页面的加载世间,可能会因为等待时间过长,而影响用例的执行效率
#弊端2:不确定页面的加载世间,可能会因为等待时间过短,而导致代码依然会报错


from selenium import webdriver
from selenium.webdriver.common.by import By

def wait_sleep():
    """
    如果直接执行,不添加任何等待,可能会报错
    """
    driver = webdriver.Chrome()
    driver.get("https://vip.ceshiren.com/")
    # 不加等待,可能会因为网速等原因产生报错
    time.sleep(3)
    driver.find_element(By.XPATH, "//*[text()='个人中心']")


if __name__ == '__main__':
    wait_sleep()
'''隐式等待'''
#问题:难以确定元素加载的具体等待时间
#解决方案:针对于寻找元素的这个动作,使用隐式等待添加配置
#演练环境:https://vip.ceshiren.com/
#原理:设置一个等待时间,轮询查找(默认0.5秒)元素是否出现,如果没出现就抛出异常
#driver.implicitly_wait(3)
#使用方法:在代码一开始运行的时候(所有的find_element动作之前)就添加隐式等待的配置,隐式等待是全局生效的
#注意:隐式等待只能解决元素查找的问题,不能解决元素交互的问题
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

def wait_sleep1():

    #如果直接执行,不添加任何等待,可能会报错
    driver = webdriver.Chrome()
    driver.get("https://vip.ceshiren.com/")
    #添加一个隐式等待
    driver.implicitly_wait(3)
    driver.find_element(By.XPATH, "//*[text()='个人中心']")


if __name__ == '__main__':
    wait_sleep1()
'''显式等待基本使用(初级)'''
#示例: WebDriverWait(driver实例, 最长等待时间, 轮询时间).until(结束条件)
#原理:在最长等待时间内,轮询,是否满足结束条件
#演练环境: https://vip.ceshiren.com/#/ui_study
#注意:在初级时期,先关注使用


'''隐式等待无法解决的问题'''
#元素可以找到,使用点击等操作,出现报错
#原因:
#页面元素加载是异步加载过程,通常html会先加载完成,js、css其后
#元素存在与否是由HTML决定,元素的交互是由css或者js决定
#隐式等待只关注元素能不能找到,不关注元素能否点击或者进行其他的交互
#解决方案:使用显式等待

import time

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


def wait_show():
    driver = webdriver.Chrome()

    driver.get('https://vip.ceshiren.com/#/ui_study')
    #time.sleep(3)
    #问题:元素可以找到,但是点击效果却没有触发(这是一条消息提示没有弹出,添加显示等待就能正常弹出)

    WebDriverWait(driver,10).until(expected_conditions.element_to_be_clickable((By.ID,'success_btn')))
    driver.find_element(By.ID, 'success_btn').click()
    time.sleep(5)


if __name__ == '__main__':
    wait_show()