Python Selenium库学习笔记

1 声明浏览器对象

from selenium import webdriver 

browser = webdriver.Chrome() #得到各类浏览器对象,当然需要先下载各类浏览器驱动
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.PhantomJS()
browser = webdriver.Safari()

2 访问页面

用 get() 方法来请求一个网页,参数传入链接 URL 即可,比如在这里我们用 get() 方法访问淘宝,然后打印出源代码,代码如下

from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.taobao.com')#请求淘宝页面
print(browser.page_source)#得到网页源代码
browser.close()#浏览器关闭

3 查找节点

用于填充表单、模拟点击等等,比如我们想要完成向某个输入框输入文字的操作,总得需要知道这个输入框在哪里吧?所以 Selenium 提供了一系列查找节点的方法,我们可以用这些方法来获取想要的节点,以便于下一步执行一些动作或者提取信息

from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
input_first = browser.find_element_by_id('q') #find_element_by_id()方法
input_second = browser.find_element_by_css_selector('#q')#find_element_by_css_selector()方法
input_third = browser.find_element_by_xpath('//*[@id="q"]')#find_element_by_xpath()方法
print(input_first, input_second, input_third)
browser.close()

列出所有获取单个节点的方法

find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector

find_element_by_id(id) 就等价于 find_element(By.ID, id),二者得到的结果完全一致。

4 查找多节点

用 find_elements() 这样的方法,方法名称中 element 多了一个 s ,注意区分,也就是说,上面列举的方法加“s”就能实现多节点查找
如果我们用 find_element() 方法,只能获取匹配的第一个节点,结果是 WebElement 类型,如果用 find_elements() 方法,
则结果是列表类型,列表的每个节点是 WebElement 类型

find_elements_by_id
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector

5 节点交互

Selenium 可以驱动浏览器来执行一些操作,也就是说我们可以让浏览器模拟执行一些动作,比较常见的用法有:
输入文字用 send_keys() 方法,清空文字用 clear() 方法,另外还有按钮点击,用 click() 方法。

from selenium import webdriver
import time

browser = webdriver.Chrome()#得到浏览器对象
browser.get('https://www.taobao.com')#请求淘宝网
input = browser.find_element_by_id('q')#查找id=q的元素,得到输入框<input>
input.send_keys('iPhone')#调用send_keys()方法输入‘iPhone’
time.sleep(1)#等待一秒
input.clear()#清空输入框
input.send_keys('iPad')#再次输入新的字符串'iPad'
button = browser.find_element_by_class_name('btn-search')#查找class为'btn-search',得到button节点
button.click()#调用click()进行搜索

6 延时等待 - 显式等待

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

browser = webdriver.Chrome() #得到浏览器对象
browser.get('https://www.taobao.com/') #发出请求
wait = WebDriverWait(browser, 10) #得到WebDriverWait对象
input = wait.until(EC.presence_of_element_located((By.ID, 'q'))) #使用EC设置等待条件:等待id为q的元素加载
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))#等待button按钮可以点击
print(input, button)

所以这样可以做到的效果就是,在 10 秒内如果 ID 为 q 的节点即搜索框成功加载出来了,那就返回该节点,如果超过10 秒还没有加载出来,那就抛出异常。
对于按钮,可以更改一下等待条件,比如改为 element_to_be_clickable,也就是可点击,所以查找按钮时是查找 CSS 选择器为 .btn-search 的按钮,如果 10 秒内它是可点击的也就是成功加载出来了,那就返回这个按钮节点,如果超过 10 秒还不可点击,也就是没有加载出来,那就抛出异常。