目录
[1. 初始化浏览器对象和访问页面](#1. 初始化浏览器对象和访问页面)
[2. 查找节点及节点交互](#2. 查找节点及节点交互)
[2.1 查找单个节点](#2.1 查找单个节点)
[2.2 查找多个节点](#2.2 查找多个节点)
[2.3 节点交互](#2.3 节点交互)
[3. 动作链](#3. 动作链)
[4. 执行 JavaScript 之下拉进度条](#4. 执行 JavaScript 之下拉进度条)
[5. 获取节点信息](#5. 获取节点信息)
[5.1 获取属性](#5.1 获取属性)
[5.2 获取文本值](#5.2 获取文本值)
[5.3 获取 ID、位置、标签名、大小](#5.3 获取 ID、位置、标签名、大小)
1. 初始化浏览器对象和访问页面
python
from selenium import webdriver
browser = webdriver.Chrome() # 初始化浏览器对象
browser.get('https://www.taobao.com/') # 访问淘宝页面
print(browser.page_source) # 得到页面源代码
browser.close()
运行代码,之后会自动弹出窗口,并访问淘宝,输出网页HTML代码。
2. 查找节点及节点交互
Selenium可以驱动浏览器完成各种操作,例如填充表单、模拟点击、输入等。但想要点击、输入等需要找到输入的地方即节点,之后点击、输入即节点交互。
2.1 查找单个节点
下面我们以淘宝网为例:
这是个输入的表单节点,之后我们获取它。可以发现这个input节点 id属性为 'q',name='q'等等,我们可以通过其属性去获取节点(属性多种,获取方式也多种)。
(1)获取方法1------特定方法
以下是所有特定方法:
python
browser.find_element_by_id('')
browser.find_element_by_name('')
browser.find_element_by_css_selector('') # CSS选择器
browser.find_element_by_xpath('')
browser.find_element_by_link_text('')
browser.find_element_by_partial_link_text('')
browser.find_element_by_tag_name('')
browser.find_element_by_class_name('')
(2)通用方法
find_element(查找方法,方式的取值),使用这个最好先from selenium.webdriver.common.by import By,方便使用。
python
from selenium import webdriver
from selenium.webdriver.common.by import By
browser = webdriver.Chrome() # 初始化浏览器对象
browser.get('https://www.taobao.com/') # 访问淘宝页面
inputElement1 = browser.find_element_by_id('q')
# inputElement11 = browser.find_element(By.ID, 'q') # 通用方法
inputElement2 = browser.find_element_by_css_selector('#q')
inputElement3 = browser.find_element_by_xpath('//*[@id="q"]')
print(inputElement1, inputElement2, inputElement3) # 三个值相同
browser.close()
2.2 查找多个节点
例如下面的导航条:
获取方法:在前面单个节点的两个获取方法的element加s即可,返回的是个列表。
python
from selenium import webdriver
browser = webdriver.Chrome() # 初始化浏览器对象
browser.get('https://www.taobao.com/') # 访问淘宝页面
inputElement = browser.find_elements_by_css_selector('.nav-hd li')
print(inputElement)
browser.close()
2.3 节点交互
现要浏览器自动去淘宝搜索ipad,我们需要先驱动浏览器打开淘宝,获取输入框节点,再使用send_keys方法输入文字,获取搜索按钮节点,用 click 方法点击按钮。
python
from selenium import webdriver
from selenium.webdriver.common.by import By
browser = webdriver.Chrome() # 初始化浏览器对象
browser.get('https://www.taobao.com/') # 访问淘宝页面
inputElement = browser.find_element_by_id('q') # 获取输入框节点
inputElement.send_keys('ipad') # 输入文字
findButton = browser.find_element_by_css_selector('.search-button button')
# 获取搜索按钮节点
findButton.click() # 点击按钮
运行程序,可以看到过程。因为没有登陆,所以会停留在登陆页面。更多操作可看官方文档介绍:7. WebDriver API --- Selenium Python Bindings 2 documentation。
3. 动作链
在前面,交互操作都是针对某个节点执行的。还有一些操作妹纸特定的执行对象,比如鼠标拖拽、键盘按键等,需要用另一种方式执行,那就是动作链。
例如,可以这样实现拖拽节点的操作,将某个节点从一处拖拽至另一处:
实例链接:菜鸟教程在线编辑器
现用代码实现拖拽:
python
from selenium import webdriver
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult')
source = browser.find_element_by_css_selector('#draggable')
target = browser.find_element_by_css_selector('#droppable')
actions = ActionChains(browser)
actions.drag_and_drop(source, target)
actions.perform()
browser.switch_to.frame('iframeResult')用于切换到子页面中,详情见:7.1.3 Selenium的用法2-CSDN博客
依次选中要拖曳的节点source和拖曳到的目标节点target,接着声明 ActionChains 对象并将其赋值为 actions 变量,然后通过调用 actions 变量的 drag_and_drop() 方法,再调用 perform() 方法执行动作,此时就完成了拖曳操作。
结果:
更多的动作链操作可以参考官方文档的动作链介绍:7. WebDriver API --- Selenium Python Bindings 2 documentation
4. 执行 JavaScript 之下拉进度条
对于某些操作,Selenium API 并没有提供。比如,下拉进度条,它可以直接模拟运行 JavaScript,此时使用 execute_script() 方法即可实现(双引号中为固定代码,多个网站都适用),代码如下:
python
from selenium import webdriver
browser = webdriver.Chrome()
# browser.get('https://www.zhihu.com/explore')
browser.get('https://news.baidu.com/')
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
browser.execute_script('alert("To Bottom")')
有了这个方法,基本上 API 没有提供的所有功能都可以用执行 JavaScript 的方式来实现了。
5. 获取节点信息
前面说过,通过 page_source 属性可以获取网页的源代码,接着就可以使用解析库(如正则表达式、Beautiful Soup、pyquery 等)来提取信息了。
不过,既然 Selenium 已经提供了选择节点的方法,返回的是 WebElement 类型,那么它也有相关的方法和属性来直接提取节点信息,如属性、文本等。这样的话,我们就可以不用通过解析源代码来提取信息了,非常方便。
接下来,就看看通过怎样的方式来获取节点信息吧。
5.1 获取属性
可以使用 get_attribute() 方法来获取节点的属性,但是其前提是先选中这个节点,示例如下:获得百度这个logo的class属性。
python
from selenium import webdriver
browser = webdriver.Chrome()
url = 'https://www.baidu.com/'
browser.get(url)
baiduLogo = browser.find_element_by_id('lg')
print(baiduLogo)
print(baiduLogo.get_attribute('class'))
python
输出:<selenium.webdriver.remote.webelement.WebElement(session="ae1b17e9e092f2155263522772036f37", element="f.25E08F3EDDDDC250A5E5784201893A30.d.2BB430665B7C306121BC019488525624.e.10")>
s-p-top
5.2 获取文本值
每个 WebElement 节点都有 text 属性,直接调用这个属性就可以得到节点内部的文本信息。
python
from selenium import webdriver
browser = webdriver.Chrome()
url = 'https://www.baidu.com/'
browser.get(url)
content = browser.find_element_by_class_name('title-content-title')
print(content.text)
browser.close()
# 输出:
# 大力推动我国新能源高质量发展
5.3 获取 ID、位置、标签名、大小
上述同样的方法,找到获取节点,用属性即可。
python
节点.id
节点.location
节点.tag_name
节点.size
本人新手,若有错误,欢迎指正;若有疑问,欢迎讨论。若文章对你有用,点个小赞鼓励一下,谢谢,一起加油吧!