所谓模拟浏览器基本就是下面的流程:
请求
显示页面
查找元素
点击可点击元素
所以如何使用selenium找到页面中的标签,进而触发标签事件,就会变的尤为重要。
1. selenium选择器
要想定位页面的元素,selenium也提供了一系列的方法。
1.通过标签id属性进行定位
browser.find_element_by_id('kw') # 其中kw便是页面中某个元素的id值
2.通过标签name属性进行定位
# 两种方式是一样的
browser.find_element_by_name("wd") # 其中wd是页面中某个元素的name值
3.通过标签名进行定位
browser.find_element_by_tag_name("img") # img参数表示的就是图片标签img
4.通过CSS查找方式进行定位
browser.find_elements_by_css_selector("#kw") # 根据选择器进行定位查找,其中#kw表示的是id选择器名称是kw的
5.通过xpath方式定位
browser.find_element_by_xpath('//*[@id="kw"]') # 参数即是xpath的语法
6.通过搜索 页面中 链接进行定位
有时候不是一个输入框也不是一个按钮,而是一个文字链接,我们可以通过link
browser.find_element_by_link_text("设置")
通过搜索 页面中 链接进行定位 ,可以支持模糊匹配**
browser.find_element_by_partial_link_text("百度") # 查找页面所有的含有百度的文字链接
2.selenium显示等待和隐式等待
显示等待:就是明确要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,就会跳出异常Exception
操作格式:WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
WebDriverWait()一般由until()或 untilnot()方法配合使用
until(method, message=' '):调用该方法提供的驱动程序作为一个参数,直到返回值为True
`untilnot(method, message=' ')`:调用该方法提供的驱动程序作为一个参数,直到返回值为False
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver = webdriver.chrome()
driver.get('http://www.baidu.com')
element = WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, "kw")))
element.send_keys('selenium')
隐式等待:就是在创建driver时,为浏览器对象创建一个等待时间,这个方法是得不到某个元素就等待一段时间,直到拿到某个元素位置。
注意:在使用隐式等待的时候,实际上浏览器会在你自己设定的时间内部断的刷新页面去寻找我们需要的元素
driver.implicitly_wait() 默认设置为0
例如: driver.implicitly_wait(10) 。如果元素在10s内定位到了,继续执行。如果定位不到,将以循环方式判断元素是否被定位到。如果在10s内没有定位到,则抛出异常
from selenium import webdriver
driver = webdriver.chrome()
driver.get('http://www.baidu.com')
# 隐式等待10秒
driver.implicitly_wait(10)
另外还有一种就是我们常用的sleep,我们称为:强制等待。
有时候我们希望脚本在执行到某一位置时暂停一段时间等待页面加载,这时可以使用sleep()方法。sleep()方法会固定休眠一定的时长,然后再继续执行。sleep()方法默认参数以秒为单位。
from time import sleep
from selenium import webdriver
driver = webdriver.chrome()
driver.get('http://www.baidu.com')
# 强制休眠2秒
sleep(2)
driver.find_element_by_id("kw").send_keys("selenium")