文章目录
环境配置
Python & Selenium
本文是基于 Pytohn-3.7.4
以及 selenium-4.11.2
进行测试的,可以直接通过 pip
命令安装 selenium
:
sh
pip install selenium
进入 python
交互界面,引入 selenium
包,检查安装结果:
py
import selenium
print(selenium.__version__) # 4.11.2
Webdriver 浏览器驱动
在准备好 Python 环境之后,还需要安装浏览器程序,selenium
通过浏览器驱动的可执行文件对浏览器进行操作。
Windows
可以直接上对应浏览器的官方网站下载安装浏览器即可
Linux
在 Linux
则需要安装对应浏览器的可执行程序以及驱动程序。
浏览器可执行程序可以通过 yum
命令来安装,例如谷歌浏览器:
sh
yum -y install google-chrome
安装完成之后,检查安装结果:
sh
google-chrome --version
然后,还需要下载对应浏览器版本的驱动,在 Selenium 官方文档的一篇文章 的下方,也提供了几款比较流行的浏览器驱动的下载方式:
需要注意,如果没有浏览器程序和驱动版本没有对应,启动时将会直接报错,提示驱动版本不匹配,此时只需要下载替换为对应版本的驱动即可。
打开浏览器
Windows 环境下可以直接通过 webdriver.Chrome()
创建浏览器驱动对象打开浏览器,在拥有图形化界面的操作系统上运行时,你可以直接看到浏览器进程启动,弹出浏览器窗口,并且后续对浏览器的一系列操作都可以实时在界面上看到:
而 Linux 环境下如果直接打开浏览器:
py
from selenium import webdriver
driver = webdriver.Chrome()
浏览器启动将会直接报错,抛出 selenium.common.exceptions.WebDriverException: Message: unkdown error: Chrome failed to start: exited abnormally
的异常,并且提示 google-chrome is no longer running
,此时 ChromeDriver
认为浏览器崩溃了。
在官方文档中有提到,在没有图形化界面的操作系统中打开浏览器,必须指定 --headless
参数启动:
py
from selenium import webdriver
from seleinum.webdriver.chrome.options import ChromeOptions
# initialize options
options = ChromeOptions()
options.add_argument('--headless')
# create chrome object
driver = webdriver.Chrome(options=options)
此时浏览器没有报错,可以正常启动。
在 Linux 或者 CentOS 等非图形化界面的操作系统执行脚本的时候,很容易遇到各种各样的问题,很多在 Windows 上面可以正常完成的流程,在 Linux 往往行为会不太一致,
页面请求
Seleinum 中通过驱动对象的 get
方法来请求一个页面:
py
当然,如果这是一个下载链接,你也可以通过这个方法来下载文件,默认下载路径是当前登录用户的 download
目录。
Selenium 的 webdriver
的驱动对象提供了一些属性可以获取当前页面的一些信息,例如:
py
# 当前页面的标题
print(driver.title) # 百度一下,你就知道
# 当前页面的路由
print(driver.current_url) # http://www.baidu.com
元素定位、操作以及内容获取
元素信息
现在已经顺利打开了一个页面,接下来可以尝试对页面的元素进行操作,Selenium 提供 find_element
方法对页面的元素进行定位:
py
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
ele = driver.find_element(by=By.ID, value="kw")
print(type(ele))
其中,by
表示的是元素定位的依据,value
为检索值,上方的代码即表示在页面中查找 id="kw"
的元素。
除了 By.ID
之外,Selenium 还支持下面的检索依据:
By.CLASS_NAME
,即元素的class
By.TAG_NAME
,即元素的标签名称,例如div
,a
,p
等By.LINK_TEXT
,可以查找链接的文本,定位特定元素,往往用于链接的点击,或者链接地址的获取By.CSS_SELECTOR
,通过 CSS 筛选器定位元素,功能类似JavaScript
的querySelector
,可以通过例如input[name="password"]
这样的方式定位元素,表示找到带有name="password"
的input
标签By.NAME
,通常是用于查找表单项元素,即找到带有对应name
属性的input
,textarea
,button
等页面交互元素
定位到元素之后,可以看到打印出来的变量类型如下:
selenium.webdriver.remote.webelement.WebElement
这是在 selenium
中的页面元素对象,这个对象中已经为我们提供了一些常用的属性可以获取页面元素的信息,例如:
py
print(ele.text) # html 元素包含的文本,例如 <div> text </div> 中的 text
print(ele.tag_name) # 元素标签名称,前文获取到的是百度的输入框,标签名为 input
print(ele.id) # 这个区别于元素的 'id' 属性,是在 selenium 中元素对象的唯一标识
print(ele.size) # 元素在页面中最终计算得到的尺寸,这里返回的输入框的尺寸为 {'height': 44, 'width': 550}
WebElement
还提供了 get_attribute
的方法,可以获取到元素所有的属性,例如 name
,id
,class
,src
,href
等:
py
print(ele.get_attribute("id")) # kw
print(ele.get_attribute(""))
还可以通过 value_of_css_property
获取到元素所有的 CSS 属性:
py
print(ele.value_of_css_property("background-color")) # 获取背景颜色
print(ele.value_of_css_property("color")) # 获取字体颜色
print(ele.value_of_css_property("font-size")) # 获取字体大小
另外 WebElement
还提供了一些方法可以帮助我们判断当前定位到的元素的状态:
py
print(ele.is_enabled()) # 是否可用,即与 disabled 属性相反
# print(not ele.get_attribute("disabled"))
print(ele.is_selected()) # 是否处于选中状态
print(ele.is_displayed()) # 是否显示
元素操作
通过 WebElement
封装的方法可以对页面元素进行操作,例如我们利用上面获取到的输入框元素,模拟搜索操作:
py
from selenium.webdriver.common.keys import Keys
ele.send_keys("python selenium" + Keys.ENTER) # 模拟键盘输入,并回车模拟搜索
也可以通过链式调用将元素定位和操作结合起来:
py
# 点击百度首页的搜索按钮 "百度一下"
driver.find_element(by=By.CSS_SELECTOR, value="input[id='su']").click()
当然,如果你不满足于这些功能,你也可以直接编写 javaScript
去执行任何当前浏览器支持的 javaScript
语法编写的脚本:
py
result = driver.execute_script("return window.location.origin")
print(result) # http://www.baidu.com
ActionChains
使用 动作链(ActionChains) 的方式同样可以实现页面元素的操作,可以支持链式的操作方法调用:
py
from selenium import webdriver
from selenium.webdriver.common.by import By'
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
# locate element
input_ele = driver.find_element(by=By.ID, value="kw")
# chain of actions
webdriver.ActionChains(driver).move_to_element(input_ele).send_keys("python selenium" + Keys.ENTER)
selenium
目前支持的常用的操作环如下:
move_to_element
:聚焦到目标元素click
:点击当前聚焦元素send_keys
:发送键盘输入到当前聚焦元素drag_and_drop
:将当前元素拖拽到目标位置之后释放key_down
:让指定按钮处于按下状态,常用于模拟组合键操作key_up
:让指定按钮取消按下状态