安装selenium
代码语言:javascript复制pip install selenium
安装驱动
驱动安装地址:
- Firefox 浏览器驱动:https://github.com/mozilla/geckodriver/releases
- Chrome 浏览器驱动:https://chromedriver.storage.googleapis.com/index.html
- IE 浏览器驱动:http://selenium-release.storage.googleapis.com/index.html
- Edge 浏览器驱动:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
- PhantomJS 浏览器驱动:https://phantomjs.org/
- Opera 浏览器驱动:https://github.com/operasoftware/operachromiumdriver/releases
将驱动放到项目目录下,或者为驱动路径配置环境变量,也可以直接指定驱动路径。
代码语言:javascript复制# 指定驱动路径
driver = webdriver.Chrome(executable_path=path)
使用示例
代码语言:javascript复制from selenium import webdriver
# Chrome浏览器
# 保持浏览器打开状态
option = webdriver.ChromeOptions()
option.add_experimental_option("detach", True)
driver = webdriver.Chrome(chrome_options=option)
# 设置参数
url = 'https://leafbackaut.cn/'
# 发起请求
driver.get(url)
元素定位
元素定位可以根据id,class等属性定位,也可以根据标签名等信息进行定位。使用定位函数后会返回一个WebElement类或一个WebElement类的列表,用于接下来的操作。
旧版元素定位
根据id定位
代码语言:javascript复制driver.find_element_by_id(id)
根据name定位
代码语言:javascript复制driver.find_element_by_name(name)
根据class定位(返回列表)
代码语言:javascript复制driver.find_elements_by_class_name(class_name)
根据tag定位(返回列表)
代码语言:javascript复制driver.find_elements_by_tag_name(tag_name)
根据xpath定位
代码语言:javascript复制driver.find_element_by_xpath(xpath)
根据css选择器定位(返回列表)
代码语言:javascript复制driver.find_element_by_css_selector(css_selector)
根据文本定位(标签必须包含全部文本)(返回列表)
代码语言:javascript复制driver.find_element_by_link_text(text)
根据部分文本定位(返回列表)
代码语言:javascript复制driver.find_element_by_partial_link_text(text)
新版元素定位(推荐)
新版元素定位将所有定位函数封装成两个函数
代码语言:javascript复制# 返回定位到的第一个元素
find_element(self, by=By.ID, value=None)
# 返回列表
find_elements(self, by=By.ID, value=None)
其中By的属性如下:
代码语言:javascript复制ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"
使用方法:
代码语言:javascript复制from selenium.webdriver.common.by import By
# 通过class定位元素
driver.find_elements(By.CLASS_NAME, 'hello')
# 也可以不传入By,直接用属性值
driver.find_element('id', 'world')
元素等待
当元素还没有被加载出来时,会因为定位元素失败而报错,因此需要使用元素等待来保证程序正常运行。
显式等待
设置一个超时时间,期间确定某个条件触发,则继续运行程序,否则抛出异常。
代码语言:javascript复制WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
参数说明:
- driver:浏览器驱动
- timeout:超时时间,单位秒
- poll_frequency:每次检测的间隔时间,默认为0.5秒
- ignored_exceptions:指定忽略的异常,默认为NoSuchElementException
判断条件:
代码语言:javascript复制until(method, message='')
until_not(method, message='')
参数说明:
- method:每隔一段时间调用这个方法
- message:如果超时,抛出TimeoutException,并显示message中的内容
使用示例:
代码语言:javascript复制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
# 打开浏览器
driver = webdriver.Chrome()
url = 'https://leafbackaut.cn/'
driver.get("url")
# 元素等待
# 锁定id为world的元素
try:
element = WebDriverWait(driver,10).until(
EC.presence_of_element_located((By.ID,"world"))
)
finally:
driver.quit()
EC包含了许多通用判断条件,具体如下:
- title_is
- title_contains
- presence_of_element_located
- visibility_of_element_located
- visibility_of
- presence_of_all_elements_located
- text_to_be_present_in_element
- text_to_be_present_in_element_value
- frame_to_be_available_and_switch_to_it
- invisibility_of_element_located
- element_to_be_clickable
- staleness_of
- element_to_be_selected
- element_located_to_be_selected
- element_selection_state_to_be
- element_located_selection_state_to_be
- alert_is_present
隐式等待
设置一个超时时间,如果超出这个时间,还有元素没有被加载出来,就会抛出NoSuchElementException异常,没超时则不影响后面的代码运行。
代码语言:javascript复制# time_to_wait为等待时间,单位为s
implicitly_wait(self, time_to_wait)
使用示例:
代码语言:javascript复制from selenium import webdriver
# 打开浏览器
driver = webdriver.Chrome(chrome_options=option)
url = 'https://leafbackaut.cn/'
driver.get(url)
# 隐式等待
driver.implicitly_wait(5)
try:
driver.find_element_by_id('hello')
except Exception as e:
print(e)