1,安装selenium库
pip install selenium
2,下载浏览器驱动,放置python目录下
1,查看浏览器当前版本的版本
2,不同的浏览器需要对应的浏览器驱动,示例为谷歌浏览器驱动
https://npm.taobao.org/mirrors/chromedriver/
ps:下载的浏览器版本号接近都可以使用
3,把下载的压缩包解压的“chromedriver.exe”,放置python目录下
4,启动谷歌浏览器
from selenium import webdriver
driver = webdriver.Chrome() # 启动谷歌浏览器
2,查看页面元素方法
页面鼠标右键,点击检查,或者直接按F12
3,selenium 基础定位方法
根据HTML语言的页面元素进行定位,以百度搜索页面练习实例
1,id 定位
HTML中id的作用是为单元(元素,标签)提供唯一的标识或标记
定位输入框的id值:"kw"
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.find_element_by_id("kw").send_keys("selenium")
2,name 定位
id 或 name 属性的值可以是引号引起来的任何字符串。字符串必须是唯一的标记,不能在同一文档中的其他 name 或 id 属性中重复使用,但是可以在不同的文档中再次使用。
定位输入框的name值:"wd"
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.find_element_by_name('wd').send_keys('selenium')
3,class 定位
class 属性定义了元素的类名,可以通过类名进行定位
定位输入框的class值:"s_ipt"
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.find_element_by_class_name('s_ipt').send_keys('selenium')
4,tag 定位
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
time.sleep(3)
driver.find_element_by_tag_name('input').send_keys('selenium')
ps:通过tag name来定位失败了。主要是tag name有很多重复的,造成了选择tag name来定位页面元素不准确,所以使用这个方法定位web元素的机会很少。
5,link 定位
link可以通过带文本的链接进行定位
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.find_element_by_link_text('新闻').click()
6,partial link 定位
partial link 相比于link 可以定位更长的文本截取部分定位
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://baike.baidu.com/item/bilibili/7056160?fromtitle=bilbili&fromid=20177274&fr=aladdin')
driver.find_element_by_partial_link_text('电竞信息科技有限公司').click()
7,XPath定位
在xml文档中,Xpath是一种定位元素的语言
1,页面检查,查看获取xpath的方法
- 复制 XPath为相对路径
- 复制完整 XPath为绝对路径定位
2,XPath 指定标签名,进行定位
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
# 指定input标签名,进行定位
driver.find_element_by_xpath('//input[@id="kw"]').send_keys("selenium")
# driver.find_element_by_xpath('//input[@name="wd"]').send_keys("selenium")
# driver.find_element_by_xpath('//input[@class="s_ipt"]').send_keys("selenium")
3,XPath 不指定标签名,可以用 “ * ” 匹配
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
# 不指定标签名,可以用*匹配
driver.find_element_by_xpath('//*[@id="kw"]').send_keys("selenium")
# driver.find_element_by_xpath('//*[@name="wd"]').send_keys("selenium")
# driver.find_element_by_xpath('//*[@class="s_ipt"]').send_keys("selenium")
# driver.find_element_by_xpath('//*[@id="s-top-left"]/a[1]').click()
4,XPath 层级与属性结合
层级与属性结合,如果一个元素本身没有可以唯一标识这个元素的属性值,那么我们可以查找其上一级元素。如果它的上一级元素可以唯一标识属性的值,就可以拿来用
1,获取的XPath值
//*[@id="form"]/span[1]
2,补充我们要定位的input标签
//*[@id="form"]/span[1]/input
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
# 层级与属性结合,如果一个元素本身没有可以唯一标识这个元素的属性值,那么我们可以查找其上一级元素。
# 如果它的上一级元素可以唯一标识属性的值,就可以拿来用
driver.find_element_by_xpath('//*[@id="form"]/span[1]/input').send_keys('selenium')
#driver.find_element_by_xpath('//*[@id="s-top-left"]/a').click()
5,XPath 绝对路径定位
绝对路径就是一级一级的从/html/.../a[1] 一直到定位的元素
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://baike.baidu.com/item/bilibili/7056160?fromtitle=bilbili&fromid=20177274&fr=aladdin')
# xpath 绝对路径定位
driver.find_element_by_xpath('/html/body/div[3]/div[2]/div/div[1]/div[35]/a[1]').click()
6,XPath 使用逻辑运算符
如果一个属性不能唯一区分一个元素,可以使用逻辑运算符连接多个属性进行元素匹配
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.find_element_by_xpath('//*[@id="kw" and @class="s_ipt"]').send_keys('selenium')
7, XPath 使用contains 方法
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.find_element_by_xpath('//*[contains(@class,"s_ipt")]/input').send_keys('selenium')
8,XPath 使用contains结合text() 方法
text() 方法用于匹配显示文本信息
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.find_element_by_xpath('//*[contains(text(),"新闻")]').click()
ps:直接使用text() 比较难定位QAQ
9,部分属性值匹配 ( 模糊匹配)
部分属性值匹配
# 匹配id以test开头的元素,id='test'
driver.findElement(By.xpath("//input[start-with(@id,'test')]"));
# 匹配id以test结尾的元素,id='test'
driver.findElement(By.xpath("//input[ends-with(@id,'test')]"));
# 匹配id中含有test的元素,id='test'
driver.findElement(By.xpath("//input[contains(@id,'test')]"));
10,使用任意值来匹配属性及元素,匹配所有input元素中含有属性的值为test的元素
driver.findElement(By.xpath("//input[@*='test']"));
11,XPath 注意定位路径里的单双引号
ps:注意 python的语法规则 双引号里面不能有双引号,同样单引号里面不能单引号,但是可以两者结合使用;
正确的写法
8,CSS 定位
css 用于描述HTML样式,可以通过css选择器绑定html的属性(id,class...)进行元素定位
1,css 选择器语法
选择器 | 例子 | 作用 |
.class | .s_ipt | class 选择器,选择 class=".s_ipt"的所有元素 |
#id | #kw | id 选择器,选择 id="kw"的所有元素 |
* | * | 选择所有元素 |
element | p | 选择所有<p>元素 |
element > element | div > input | 选择父元素为 <div>的所有 <input> 元素 |
element + element | div + input | 选择同一级中紧接在 <div> 元素之后的所有 <input> 元素 |
[attribute=value] | [target=_blank] | 选择 target="_blank" 的所有元素 |
2,通过class 定位
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.find_element_by_css_selector(".s_ipt").send_keys("selenium")
3,通过id 定位
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.find_element_by_css_selector("#kw").send_keys("selenium")
4,通过标签名进行定位
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
#driver.find_element_by_css_selector("input").send_keys("selenium")
ps:存在多个重复标签,容易导致无法识别,不太推荐直接使用标签定位
5,通过标签层级关系进行定位
span > input
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.find_element_by_css_selector("span > input").send_keys("selenium")
6,通过属性定位
1,定位输入框
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.find_element_by_css_selector('[name="wd"]').send_keys("selenium")
# driver.find_element_by_css_selector('[autocomplete="off"]').send_keys("selenium")
# driver.find_element_by_css_selector('[maxlength="255"]').send_keys("selenium")
2,定位按钮
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.find_element_by_css_selector('[name="wd"]').send_keys("selenium")
driver.find_element_by_css_selector('[type="submit"]').click()
7,组合定位
1,id组合
form#form > span > input#kw
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.find_element_by_css_selector('form#form > span > input#kw').send_keys("selenium")
2,class组合
form.fm > span > input.s_ipt
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.find_element_by_css_selector('form.fm > span > input.s_ipt').send_keys("selenium")
8,css其他的定位方法
1, * 查找class包含s_ipt_wr的元素
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
# * 查找class包含s_ipt_wr的元素
driver.find_element_by_css_selector("[class*=s_ipt_wr]").send_keys("selenium")
# 不知道为啥定位不到QAQ
2, ^ 查找class以s_ipt开头的元素
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
# ^ 查找class以s_ipt开头的元素
driver.find_element_by_css_selector("[class^=s_ipt]").send_keys("selenium")
3, $ 查找class结尾为s_btn的元素
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
# $ 查找class结尾为s_btn的元素
driver.find_element_by_css_selector("[class^=s_ipt]").send_keys("selenium")
driver.find_element_by_css_selector("[class$=s_btn]").click()
4, 通过检查,直接复制 selector
#kw
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.find_element_by_css_selector("#kw").send_keys('selenium')
input#kw
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.find_element_by_css_selector("input#kw").send_keys('selenium')
4,以find_element() 方法进行定位
ps: 使用基础,xpath,css方法进行定位时会警示: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead
原因:弃用警告:不推荐使用 find_element_by_* 命令。 请改用 find_element()
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.find_element("id","kw").send_keys("selenium")
# driver.find_element("name",'wd').send_keys('selenium')
# driver.find_element("class name","s_ipt").send_keys('selenium')
# driver.find_element("tag name","input").send_keys('selenium')
# driver.find_element("link text","新闻").click()
# driver.get('https://baike.baidu.com/item/bilibili/7056160?fromtitle=bilbili&fromid=20177274&fr=aladdin')
# driver.find_element("partial link text", "电竞信息科技有限公司").click()
# driver.find_element("xpath", '//*[@id="kw"]').send_keys("selenium")
# driver.find_element("css selector", '#kw').send_keys("selenium")
5,用 By 定位元素
WebDriver 还提供另外一套写法,即统一调用find_element() 方法,通过By来声明定位,并且传入对应的定位参数
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.find_element(By.ID, "kw").send_keys("selenium")
#driver.find_element(By.NAME, "wd").send_keys("selenium")
#driver.find_element(By.CLASS_NAME, "s_ipt").send_keys("selenium")
#driver.find_element(By.TAG_NAME, "input").send_keys("selenium") # 存在重复input,无法识别
#driver.find_element(By.LINK_TEXT, "新闻").click()
#driver.find_element(By.PARTIAL_LINK_TEXT, "地").click()
#driver.find_element(By.XPATH, '//*[@id="kw"]').send_keys("selenium")
#driver.find_element(By.CSS_SELECTOR, '#kw').send_keys("selenium")
6,通过javasrcip 进行定位
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
# id定位:document.getElementById()
js = "document.getElementById('kw').value='selenium';"
driver.execute_script(js)
# name定位:document.getElementsByName()
# js = "document.getElementsByName('wd')[0].value='selenium';"
# driver.execute_script(js)
# class定位:document.getElementsByClassName()
# js = "document.getElementsByClassName('s_ipt')[0].value='selenium';"
# driver.execute_script(js)
# css定位:document.querySelectorAll()
# js2 = "document.querySelectorAll('#su')[0].click();"
# driver.execute_script(js2)
7,通过jQuery 定位
JQ1 = "$('#kw').val('selenium')"
JQ2 = "$('.s_btn').click()"
driver.execute_script(JQ1)
driver.execute_script(JQ2)
总结:
1,selenium 定位的方法很多,写自动化脚本时需,尽量定位唯一标识的元素;
2,tag 定位没一个是成功的emmm,无法定位,成功率太低了=/=
3,还不大理解 find_elements() 的用法 emmm 看看能不能后面学习到再补充完整
4,后面能搞定动态元素的定位就好了0.0