一、安装Chrome驱动
selenium提供可以进行多个驱动,注意,不是国内的驱动,国内浏览器是不认可的,是世界公认的浏览器才可以使用驱动,如:chrome,Edge,Firefox,Safari
这里咋们进行Chrome驱动下载,注意:驱动版本要与你的chrome浏览器版本一致
官方网址:https://sites.google.com/a/chromium.org/chromedriver/downloads
但是一般情况下官方的驱动版本很低,可以使用下方的驱动:Chrome for Testing availability (googlechromelabs.github.io)
下载完成之后放入到你的python路径中
二、selenium
一、Chrome驱动实例化
可以理解为打开浏览器,创建了一个浏览器对象,以chrome浏览器为例:
from selenium import webdriver
# 谷歌驱动初始化
Chrome = webdriver.Chrome()
二、窗口最大化
在进行浏览器使用时,可以将窗口最大化,因为在进行使用浏览器对象Chrome时打开的浏览器不是最大化的窗口,窗口最大化是因为在后续进行元素定位是确保所有元素能加载出来,不会出现元素加载不出来,定位不到现象,使用的是maximize_window()方法
from selenium import webdriver
# 谷歌驱动初始化
Chrome = webdriver.Chrome()
# 窗口最大化
Chrome.maximize_window()
三、浏览器输入网址
使用get方法可以往浏览器输入网址,例如:打开百度
import time
from selenium import webdriver
# 谷歌驱动初始化
Chrome = webdriver.Chrome()
# 窗口最大化
Chrome.maximize_window()
# 打开百度页面
Chrome.get("https://www.baidu.com/")
四、浏览器如何查找元素
如何查看浏览器的元素进行定位呢,使用F12或者右键打开开发者选项,找到Elements,点击左上角的小箭头,选中之后选择需要定位的地方就可以找到对应的元素,后续在selenium中使用相应的定位方式进行定位
五、selenium查找元素方法
一、查看一个元素
使用find_element来查找一个元素,可以直接进行点击、输入等操作
from selenium import webdriver
import time
# 谷歌驱动初始化
Chrome = webdriver.Chrome()
# 窗口最大化
Chrome.maximize_window()
# 打开百度页面
Chrome.get("https://www.baidu.com/")
time.sleep(5)
#find_element 查找一个元素
Chrome.find_element(‘定位方式’, '元素')
二、查看一组元素
使用find_elements来查找一组元素,输出的是一个列表,所以遍历的话使用索引的话与列表一直从0开始
from selenium import webdriver
# 谷歌驱动初始化
Chrome = webdriver.Chrome()
# 窗口最大化
Chrome.maximize_window()
# 打开百度页面
Chrome.get("https://www.baidu.com/")
time.sleep(5)
#find_elements 获取一组元素
Chrome.find_elements(定位方式, 元素)
六、八大定位方式
使用定位需要用到By方法
一、ID 定位
通过ID属性进行定位,以百度为例,定位输入框,查找到的百度输入框id='kw',那么使用代码如下
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
# 谷歌驱动初始化
Chrome = webdriver.Chrome()
# 窗口最大化
Chrome.maximize_window()
# 打开百度页面
Chrome.get("https://www.baidu.com/")
time.sleep(5)
#使用ID进行定位
Chrome.find_element(By.ID, 'kw')
二、NAME 定位
通过Name属性进行定位,以百度为例,定位输入框
查找到的百度输入框按name属性看的话是name = 'wd',代码如下:
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
# 谷歌驱动初始化
Chrome = webdriver.Chrome()
# 窗口最大化
Chrome.maximize_window()
# 打开百度页面
Chrome.get("https://www.baidu.com/")
#添加等待等待页面加载完成,元素全部展示出来
time.sleep(5)
#使用NAME进行定位
Chrome.find_element(By.NAME, 'wd')
三、CLASS_NAME 定位
通过CLASS属性进行定位,以百度为例,定位输入框
查找到的百度输入框按CLASS属性看的话是class="s_ipt",代码如下:
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# 谷歌驱动初始化
Chrome = webdriver.Chrome()
# 窗口最大化
Chrome.maximize_window()
# 打开百度页面
Chrome.get("https://www.baidu.com/")
# 等待页面加载完成
time.sleep(5)
# 使用CLASS_NAME 定位
Chrome.find_element(By.CLASS_NAME, 's_ipt')
四、CSS_SELECTOR 定位
使用css进行定位,
CSS详解:如何使用css进行定位
标签名开头
input
# 使用id定位
# 后面加id元素 id='kw'
#kw
通过class类名定位
# .后面加class的元素值,class='s_pi'
.s_pi
[]内部放属性
# []放入属性值 name='11'
[name='11']
通过属性前缀定位
# 属性 attribute 的值以 value 开头的元素
[attribute^=value]
通过属性包含定位
属性 attribute 的值包含 value 的元素
[attribute*=value]
通过子元素定位
# parent 下的直接子元素 child
parent > child
冒号,通过伪类进行定位
#作为其父元素的第 n 个子元素的元素。
:nth-child(n)
selenium中使用
以百度输入框为例,输入#kw定位
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# 谷歌驱动初始化
Chrome = webdriver.Chrome()
# 窗口最大化
Chrome.maximize_window()
# 打开百度页面
Chrome.get("https://www.baidu.com/")
# 等待页面加载完成
time.sleep(5)、
# 使用CSS_SELECTOR 定位
Chrome.find_element(By.CSS_SELECTOR, '#kw')
五、TAG_NAME定位
使用标签进行定位,以百度输入框为例,定位到input,但是如何当前页面存在多个input标签,会定位错误。不要推荐使用。
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# 谷歌驱动初始化
Chrome = webdriver.Chrome()
# 窗口最大化
Chrome.maximize_window()
# 打开百度页面
Chrome.get("https://www.baidu.com/")
# 等待页面加载完成
time.sleep(5)
#使用TAG_NAME 标签定位
Chrome.find_element(By.TAG_NAME, 'input')
六、LINK_TEXT 定位
LINK_TEXT为超链接文本定位,只能用于超链接,以百度页面上的热点话题为例。
LINK_TEXT是只有文本全部都一样才可以定位到,可能存在定位不到,这个时候可以使用PARTIAL_LINK_TEXT定位方式
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# 谷歌驱动初始化
Chrome = webdriver.Chrome()
# 窗口最大化
Chrome.maximize_window()
# 打开百度页面
Chrome.get("https://www.baidu.com/")
# 等待页面加载完成
time.sleep(5)
#使用LINK_TEXT 定位
Chrome.find_element(By.LINK_TEXT, '男子伤害妻女和外孙 已自杀身亡”')
七、PARTIAL_LINK_TEXT定位
PARTIAL_LINK_TEXT为部分超链接文本定位,只能用于超链接,与LINK_TEXT的去别在于,只要写一部分超链接文本就可以定位成功,有点模糊定位的意思。以百度为例,
如何使用LINK_TEXT进行定位会定位不到了,因为打印是时候会打印出来前面的序列号或者后面的热字,所以用PARTIAL_LINK_TEXT就可以定位到。
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# 谷歌驱动初始化
Chrome = webdriver.Chrome()
# 窗口最大化
Chrome.maximize_window()
# 打开百度页面
Chrome.get("https://www.baidu.com/")
# 等待页面加载完成
time.sleep(5)
#使用PARTIAL_LINK_TEXT 定位
Chrome.find_element(By.PARTIAL_LINK_TEXT, '男子伤害妻女和外孙 已自杀身亡”')
八、XPATH 定位(万能)
XPath(XML Path Language)是一种用于在 XML 文档中定位节点的语言,属于万能定位。
以//开头,//是过滤后面加标签,[@属性=‘属性值’]之后a/b,b为a的子级。以百度的输入框为例
可以直接定位到//input[@id='kw'],意思是id的属性值为kw的input标签
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# 谷歌驱动初始化
Chrome = webdriver.Chrome()
# 窗口最大化
Chrome.maximize_window()
# 打开百度页面
Chrome.get("https://www.baidu.com/")
# 等待页面加载完成
time.sleep(5)
# XPATH 定位
Chrome.find_element(By.XPATH, '//input[@id="kw"]')
也可以定位为//form[@id="form"]/span[1]/input,代码如下
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
# 谷歌驱动初始化
Chrome = webdriver.Chrome()
# 窗口最大化
Chrome.maximize_window()
# 打开百度页面
Chrome.get("https://www.baidu.com/")
# 等待页面加载完成
time.sleep(5)
# XPATH 定位
Chrome.find_element(By.XPATH, '//form[@id="form"]/span[1]/input')
七、对元素进行操作
一、点击:click()
使用click方法进行模拟用户点击,代码如下
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# 谷歌驱动初始化
Chrome = webdriver.Chrome()
# 窗口最大化
Chrome.maximize_window()
# 打开页面
Chrome.get("网址")
# 等待页面加载完成
time.sleep(5)
# 查找到元素之后进行点击,点击按钮
Chrome.find_element(By.XPATH, '元素').click()
二、输入:send_keys()
使用send_keys()进行输入框输入,代码如下
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# 谷歌驱动初始化
Chrome = webdriver.Chrome()
# 窗口最大化
Chrome.maximize_window()
# 打开页面
Chrome.get("网址")
# 等待页面加载完成
time.sleep(5)
#send_keys 进行输入框输入
Chrome.find_element(By.XPATH, '元素').send_keys('想要输入的值')
八、三种 等待方式
一、time模块
time.sleep(5)固定等待,到不时间不会执行之后的代码
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# 谷歌驱动初始化
Chrome = webdriver.Chrome()
# 窗口最大化
Chrome.maximize_window()
# 等待页面加载完成,等待五秒
time.sleep(5)
print('五秒之后输出')
隐式等待:implicitly_wait()
implicitly_wait()是Selenium WebDriver 提供的一种等待机制,作用域是全局,它设置了一个全局的等待时间,WebDriver 在查找元素时会等待指定的时间。如果在指定时间内找到了元素,立即继续执行;如果在指定时间内没有找到元素,则抛出 NoSuchElementException
。代码如下:
from selenium import webdriver
from selenium.webdriver.common.by import By
# 谷歌驱动初始化
Chrome = webdriver.Chrome()
# 窗口最大化
Chrome.maximize_window()
# 等待页面加载完成
Chrome.implicitly_wait(5)
# 五秒内查找元素是否存在,存在就继续执行,不存在就抛出错误
Chrome.find_element(By.XPATH, '元素')
显示等待:WebDriverWait
用于在特定条件满足之前暂停代码执行。与 implicitly_wait
不同,WebDriverWait
允许你指定等待的条件,并在条件满足时立即继续执行,而不是等待固定的时间。
使用方法:WebDriverWait
通常与 expected_conditions
模块一起使用,以便等待某些条件(如元素可见、元素可点击等)满足,针对单一元素。代码如下:
WebDriverWait中的driver为浏览器驱动,timeout为超时时间,poll_frequency为多长时间查找一次,默认是0.5秒查询一次
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
# 谷歌驱动初始化
Chrome = webdriver.Chrome()
# 窗口最大化
Chrome.maximize_window()
# 打开页面
Chrome.get("网址")
# 等待页面加载完成
Chrome.implicitly_wait(5)
#在10秒内每两秒轮询查看一次看元素是否可以点击
element = WebDriverWait(driver=Chrome,timeout=10,poll_frequency=2).until(EC.element_to_be_clickable((By.XPATH,'元素')))
# 元素查找都按之后进行后续操作
element.click()
# 关闭浏览器
Chrome.quit()
九、浏览器关闭
selenium提供了两中关闭浏览器的方法,quit()和close(),默认是quit()
一、quit()
定义:quit()
方法关闭所有与 WebDriver 会话相关的浏览器窗口,并终止 WebDriver 会话
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("网址")
# 执行一些操作
driver.quit() # 关闭所有浏览器窗口并终止 WebDriver 会话,将驱动关闭
二、close()
定义:close()
方法仅关闭当前的浏览器窗口,但不会终止 WebDriver 会话
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("网址")
# 关闭当前窗口
driver.close() #关闭当前窗口,如果存在多个窗口,需要切换窗口权柄,不会关闭浏览器驱动