""" 等待三种方式 1、进程等待 time.sleep() 2、隐性等待(等待资源加载完成) driver.implicitly_wait(5) 接收浮点型数据,表示超时时间,最多等待 3、显性等待 (条件等待) WebDriverWait(driver,10,0.5).until(EC.presence_of_element_located(locator)) """
1、进程等待
需要导入time模块,time.sleep(1),进程休眠1s后再执行,项目中常用等待方式。和浏览器没有关系,每个需要等待的时候均需要time.sleep()语句。
例如:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
driver=webdriver.Chrome()
driver.maximize_window()
driver.get("http://xxx.testedu.com/index.php?s=/index/search/index.html") #打开首页
ele=driver.find_element(By.LINK_TEXT,"登录") #首页点击登录
ele.click()
ele_account=driver.find_element(By.NAME,"account")
ele_account.send_keys("test")
time.sleep(1) #进程休眠1s后再执行后面的代码
ele_password=driver.find_element(By.NAME,"pwd")
ele_password.send_keys("password")
time.sleep(1) #进程休眠1s,即输入密码后,等1s才执行寻找登录元素,点击登录元素的动作
button_login=driver.find_element(By.XPATH,"//button[@type='submit'][text()='登录']")
button_login.click()
2、隐性等待
等待资源加载完成,最多等待的时间,时间可以是浮点型,driver.implicitly_wait(5),项目中用的比较少。和浏览器有关系,只需要申明一次,是全局有效。
from selenium import webdriver
from selenium.webdriver.common.by import By
driver=webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(0.1) #隐性等待,只要找到元素就执行后面的,如果没有找到最长等待0.1s后就执行后面的
driver.get("http://xxx.testedu.com/index.php?s=/index/search/index.html")
ele=driver.find_element(By.LINK_TEXT,"登录")
ele.click()
ele_account=driver.find_element(By.NAME,"account")
ele_account.send_keys("test")
ele_password=driver.find_element(By.NAME,"pwd")
ele_password.send_keys("password")
button_login=driver.find_element(By.XPATH,"//button[@type='submit'][text()='登录']")
button_login.click()
home_text=driver.find_element(By.CSS_SELECTOR,".menu-hd")
print(home_text.text) #获取元素中的文本
driver.quit()
3、显性等待,即条件等待,在给定的时间内循环按照条件寻找元素,如果有就返回,如果没有就抛出异常,如:10s时间内每0.5s循环一次寻找元素
WebDriverWait(driver,10,0.5).until(EC.presence_of_element_located(locator))
常用的四种显性等待如下:
#普通的寻找元素,寻找一个元素,寻找的元素都是存在于HTML中的元素,可以有不可见元素 WebDriverWait(driver,10,0.5).until(EC.presence_of_element_located(locator)) #寻找的元素必须是,显示在界面中的元素,可点击,可以输入 WebDriverWait(driver,10,0.5).until(EC.visibility_of_element_located(locator)) #寻找的元素必须是,没有显示在界面上的 WebDriverWait(driver,10,0.5).until(EC.invisibility_of_element_located(locator)) #普通的寻找所有元素 WebDriverWait(driver,10,0.5).until(EC.presence_of_all_elements_located(locator))
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 as EC #导包等待的条件的集合包,并设置别名
driver=webdriver.Chrome()
driver.maximize_window()
driver.get("http://xxx.testedu.com/index.php?s=/index/search/index.html")
ele=driver.find_element(By.LINK_TEXT,"登录")
ele.click()
ele_account=driver.find_element(By.NAME,"account")
ele_account.send_keys("test")
ele_password=driver.find_element(By.NAME,"pwd")
ele_password.send_keys("password")
button_login=driver.find_element(By.XPATH,"//button[@type='submit'][text()='登录']")
button_login.click()
locator=(By.CSS_SELECTOR,".menu-hd") #定位元素方式和定位元素的值
#根据定位元素方式和定位元素的值,每0.5s寻找一次元素,找到即返回元素,循环时间超过10s,抛出异常-未找到元素
home_text=WebDriverWait(driver,10,0.5).until(EC.presence_of_element_located(locator))
print(home_text.text) #获取元素中的文本