文章目录
环境配置
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.2Webdriver 浏览器驱动
在准备好 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.comActionChains
使用 动作链(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:让指定按钮取消按下状态