一、为什么需要等待

浏览器进行渲染内容过多, 网速太慢
为了提高脚本的稳定性,我们需要在脚本中增加等待时间,否则报错

二、等待方式

  • 强制等待
time.sleep(6)
  • 显式等待
from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait #WebDriverWait库 负责循环等待
from selenium.webdriver.support import expected_conditions as EC #expected_conditions类 负责条件
form selenium.common.exceptions import TimeoutException #超时异常

判断页面是否已经加载出来

presence_of_all_elements_located

显式等待指定某个条件,然后设置最长等待时间。如果在这段时间还没有找到元素,那么便会抛出异常。

WebDriverWait(driver,10,0.5).until( 
EC.presence_of_element_located((By.ID, "myDynamicElement")
)

定一一个​​WebDriver​​​,将浏览器对象放进去,等待10秒,每隔0.5秒去定位一下想要的元素(此处通过id形式,拿​​myDynamicElement​​去定位一个元素)

判断当前的元素是否可以点击
WebDriverWait(driver, 10, 0.5).until(
EC.element_to_be_clickable((By.ID, "myDynamicElement")
)
  • 隐式等待
    就是简单地设置一个最大等待时间,单位为秒, 所有的元素定位操作都会使用该时间
driver.implicitly_wait(10)

三、 无头浏览器

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By


#创建一个无头浏览器对象
chrome_options = Options()
#设置它为无框模式
chrome_options.add_argument('--headless')
#如果在windows上运行需要加代码
chrome_options.add_argument('--disable-gpu')
browser = webdriver.Chrome(chrome_options=chrome_options)

selenium三种方式页面等待_chrome

selenium三种方式页面等待_css_02


selenium三种方式页面等待_等待时间_03

其他
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
from selenium.common.exceptions import TimeoutException


driver = webdriver.Chrome()
wait = WebDriverWait(driver, 3, 3)

def login_felima(loginname, loginpassword):
driver.get('http://www.****.com/')

try:
name = wait.until(EC.presence_of_element_located((By.ID,'loginname')))
name.send_keys('{}'.format(loginname))

password = wait.until(EC.presence_of_element_located((By.ID, 'loginpassword')))
password.send_keys('{}'.format(loginpassword))

submit = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="logFrm"]/div[4]/input')))
submit.click()

captcha = wait.until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="account"]')))[0]
captcha.click()


wait.until(EC.presence_of_element_located((By.ID, 'keyword'))).clear()

p = WebDriverWait(driver, 3, 3).until(EC.presence_of_element_located((By.ID, 'show_info'))).text
phone = WebDriverWait(driver, 3, 3).until(EC.presence_of_element_located((By.ID, 'txtPhone'))).get_attribute('value')
element = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located(By.ID, 'mydynmicElement'))

# 判断页面是否加载出来
#presence_of_all_elements_located
#element_to_be_clickable


except TimeoutException:

return login_felima(loginname, loginpassword)

def main():
loginname = ''
loginpassword = ''
login_felima(loginname, loginpassword)

if __name__ == '__main__':
main()
dirver.find_element_by_css_selector('#名字')
dirver.find_element_by_css_selector('.s_ipt')
dirver.find_element_by_css_selector('input')
dirver.find_element_by_css_selector('[id="kw"]')

# 组合形式
dirver.find_element_by_css_selector('input.s_ipt')
dirver.find_element_by_css_selector('input > span > a')
selenium 在frame应用
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By


#创建一个无头浏览器对象
chrome_options = Options()
#设置它为无框模式
chrome_options.add_argument('--headless')
#如果在windows上运行需要加代码
chrome_options.add_argument('--disable-gpu')
browser = webdriver.Chrome(chrome_options=chrome_options)
browser.get('http://gn.gov.cn/Infd.aspx?TenderProject=Co%3D')
browser.find_element_by_id('bidderNoticeInfos').click()
reference = browser.switch_to.frame("frame")
print(browser.page_source)