加入等待时间,主要是加载网页需要时间,可能是网速慢,或者使用ajax技术实现异步加载等,如果程序找不到指定的页面元素,将导致发生错误。常用的等待方式有三种:强制等待、隐式等待、显式等待和强制等待。使用Python自带的库time.sleep()可以实现强制等待。强制等待好用,但是在网络条件好的时候建议减少使用,因为如果经常使用强制等待等待元素加载,会拉长整个项目的自动化时间。这种等待方法的使用场景主要是脚本调试。隐式等待隐式等待其实就是设置一个最长的等待时间。如果目标可以在此期间内定位,则执行下一步。否则,将执行下一步,直到指定的时间结束。如果隐式等待设置一次,它会作用于整个驱动周期,所以可以在最开始的时候设置一次。注意:在同一个驱动循环中遇到强制等待可能会导致隐式等待失败#隐式等待,京东的“新人福利”fromseleniumimportwebdriverfromtimeimportsleeppedriver=webdriver.Chrome()#打开浏览器驱动。maximize_window()#浏览器最大化driver.get("https://www.jd.com/")#跳转到京东driver.implicitly_wait(10)#隐式等待10selement=driver.find_element_by_xpath("//*[@class='user_profit_lk']")#定位元素element.click()#点击sleep(3)driver.quit()#关闭浏览器显式等待WebDriverWait是Selenium提供的一个显式等待模块,使用原理是:以内在指定的时间范围内,等待某个条件满足/失败。导入方法:fromselenium.webdriver.support.waitimportWebDriverWaitWebDriverWait参数:序号参数说明1driver传入的WebDriverWait实例2timeout超时时间,最长等待时间3poll_frequencyuntil或until_not调用方法的间隔时间(默认为0.5秒)4ignored_exceptions忽略的异常WebDriverWait模块包含两个方法:untiluntil_notuntil和until_not参数:序号参数说明1method等待期间,定时调用传入的方法,直到返回值不为False2message如果超时,会抛出TimeoutExceptionmessage传入异常通常情况下,WebDriverWait模块会和expected_conditions模块一起使用,将参数写入until和until_not—方法中。expected_conditions模块有如下等待条件:序号等待条件方法说明1title_is(object)判断标题,是否出现2title_contains(object)判断标题是否包含某些字符3presence_of_element_located(object)--常用判断是否出现一个元素已经添加到dom树中,并不代表该元素一定是可见的4visibility_of_element_located(object)--常用来判断一个元素是否已经添加到dom树中并且可见,宽高是否大于05visibility_of(object)判断元素是否可见,如果可见则返回该元素6presence_of_all_elements_located(object)判断dom树中是否至少存在一个元素7visibility_of_any_elements_located(object)判断是否至少有一个元素在dom树中可见page8text_to_be_present_in_element(object)判断指定元素是否包含expectedstring9text_to_be_present_in_element_value(object)判断指定元素的属性值是否包含期望的字符串10frame_to_be_available_and_switch_to_it(object)判断frame是否可以切换11invisibility_of_element_located(object)判断dom树中元素是否存在或不可见12element_to_be_clickable(object)判断某个元素某个元素是否可见可点击13staleness_of(object)等待某个元素从dom树中删除14element_to_be_selected(object)判断某个元素是否被选中,一般用在下拉列表中15element_selection_state_to_be(object)判断元素的选中状态是否符合预期16element_located_selection_state_to_be(object)判断元素的选中状态是否符合预期17alert_is_present(object)判断是否在页面上出现提示弹窗#模拟场景:点击京东首页“新人福利”fromseleniumimportwebdriverfromtimeimportsleepfromselenium.webdriver.common.byimportByfromselenium.webdriver.support.waitimportWebDriverWaitfromselenium.webdriver。支持importexpected_conditionsasECd=webdriver.Chrome()#打开浏览器driver.maximize_window()#浏览器最大化driver.get("https://www.jd.com/")#跳转到京东element=WebDriverWait(driver,20,0.5).until(EC.visibility_of_element_located((By.XPATH,"//*[@class='user_profit_lk']")))#20秒内,直到元素可以定位到页面上element.click()#clicksleep(3)driver.quit()显式等待,虽然比其他等待方式使用起来复杂,但它的优势在于灵活性。封装后可以通过简单的调用应用到自动化测试项目中
