一、为什么需要等待
浏览器进行渲染内容过多, 网速太慢
为了提高脚本的稳定性,我们需要在脚本中增加等待时间,否则报错
二、等待方式
- 强制等待
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)
其他
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)