前言
前面已经把环境搭建好了, 现在开始使用 Selenium 中的 webdriver 框架编写自动化代码脚本, 我们常见的在浏览器中的操作都会有相对应的类方法, 这些方法需要定位才能操作元素, 不同网页的元素也不同, 可以根据自己情况选择使用类方法. 下面开始学习元素定位;
New 一个后缀为. py 的 Python 文件写一段代码, 先感受一下代码吧! 写完以后 Ctrl+Shift+F10 运行代码.
- # -*- coding:utf-8 -*-
- from selenium import webdriver # 从 selenium 模块中导入 webdrive 类
- driver = webdriver.Chrome() # 定义新的变量名, 打开浏览器
- driver.maximize_window() # 浏览器窗口最大化
- driver.get("https://baidu.com") # 打开百度网址
- # 定位百度首页的搜索框, 然后在搜索框中输入 Selenium
- driver.find_element_by_id('kw').send_keys('Selenium')
- # 定位百度首页的百度一下, 然后点击一下
- driver.find_element_by_id('su').click()
浏览不同的网页元素也不同, 可以选择使用最合适你的情况的方法使用, 下面介绍 Selenium 其中的 16 种定位方法:
WebDriver8 种基本元素定位方式:
id 定位: find_element_by_id(self, id_)
name 定位: find_element_by_name(self, name)
class 定位: find_element_by_class_name(self, name)
tag 定位: find_element_by_tag_name(self, name)
link 定位: find_element_by_link_text(self, link_text)
partial_link 定位: find_element_by_partial_link_text(self, link_text)
xpath 定位: find_element_by_xpath(self, xpath)
CSS 定位: find_element_by_css_selector(self, css_selector)
这 8 种其实和上面的 8 种一样的只不过后者是以复数形式出现 (这些复数定位方法会返回一个列表的值):
id 复数定位: find_elements_by_id(self, id_)
name 复数定位: find_elements_by_name(self, name)
class 复数定位: find_elements_by_class_name(self, name)
tag 复数定位: find_elements_by_tag_name(self, name)
link 复数定位: find_elements_by_link_text(self, text)
partial_link 复数定位: find_elements_by_partial_link_text(self, link_text)
xpath 复数定位: find_elements_by_xpath(self, xpath)
CSS 复数定位: find_elements_by_css_selector(self, css_selector)
8 种基本定位介绍, 掌握这 8 种基本可以横着走了:
以百度为例这张图是百度输入框的, 一眼看过去就看到了三种定位方式:
1. 通过 id 定位:
driver.find_element_by_id('kw').send_keys('Selenium')
2. 通过 name 定位:
driver.find_element_by_name('wd').send_keys('Selenium')
3. 通过 class 定位:
driver.find_element_by_class_name('s_ipt').send_keys('Selenium')
4. 通过 tag 定位:
tag 其实是通过标签名去定位的, 一般情况下一个页面会存在大量相同的标签名这种定位方式不是很实用, 所以用的也就比较少;
driver.find_element_by_tag_name('input').send_keys('Selenium')
5. 通过 link_text 定位:
html 代码中以 a 标签开头的一般是超链接元素的标记可以使用 link_text 可以精准匹配;
<a href="http://news.baidu.com" name="tj_trnews" class="mnav"> 新闻 </a>
driver.find_element_by_link_text('新闻').click()
6. 通过 partial_link_text 定位:
这种定位方式和上面的一样也是通过 HTML 的 a 标签定位, 唯一不同的这种方式是模糊匹配, 当超链接名称过长时, 这时候可以使用模糊匹配方式, 截取其中一部分字符串就可以了;
driver.find_element_by_partial_link_text('闻').click()
7. 通过 xpath 定位:
xpath 是 xml 路径语言, 它可以用来确定 xml 文档中的节点元素位置, 通过元素的路径来完成对元素的查找. HTML 就是 xml 的一种实现方式, 可以自行选择绝对路径和相对路径作为匹配的路径
双斜杠 (//) = 相对路径, 可以选择任何一个节点作为起始点
单斜杆 (/) = 绝对路径, 就是从网页代码的 HTML 开始一层一层找
(*)= 匹配任何元素节点;(@*)= 匹配任何属性节点
xpath 可以使用 id,name,class 元素进行定位:
- # 使用 xpath 方法的 id 属性定位
- driver.find_element_by_xpath("//*[@id='kw']").send_keys('Selenium')
- # 使用 xpath 方法的 name 属性定位
- driver.find_element_by_xpath("//*[@name='wd']").send_keys('Selenium')
- # 使用 xpath 方法的 class 属性定位
- driver.find_element_by_xpath("//*[@class='s_ipt']").send_keys('Selenium')
除了使用 class,id,name 定位, 也可以手动选取节点来进行定位:
- # 使用 // 选取当前节点
- driver.find_element_by_xpath("//input[@id='kw']").send_keys('Selenium')
- # 使用 // 选取父节点
- driver.find_element_by_xpath("//span[@class='bg s_ipt_wr quickdelete-wrap']/input").send_keys('Selenium')
- # 使用 // 选取爷节点
- driver.find_element_by_xpath("//form[@id='form']/span[1]/input").send_keys('Selenium')
使用绝对路径定位代码会很长, 有其中一个元素发生变化就会失效. 还有就是程序在运行的时候会检索会比较慢, 剥丝抽茧一层层的找会很慢, 不建议使用;
driver.find_element_by_xpath('html/body/div[1]/div[1]/div/div[1]/div/form/span[1]/input').send_keys('Selenium')
8. 通过 CSS 定位:
CSS 也颇为强大 xpath 可以干的事 CSS 也可以干, CSS 的语法更为简洁, 更为高效. 而相对初学者 xpath 看起来更直观, 更好理解;
- # 使用 CSS 通过 id 定位
- driver.find_element_by_css_selector('#kw').send_keys('Selenium')
- # 使用 CSS 通过 class 定位
- driver.find_element_by_css_selector('.s_ipt').send_keys('Selenium')
- # 使用 CSS 通过 name 定位
- driver.find_element_by_css_selector("[name='wd']").send_keys('Selenium')
- # 使用 CSS 通过 autocomplete 定位
- driver.find_element_by_css_selector("[autocomplete='off']").send_keys('Selenium')
CSS 除了使用元素的属性定位也可以和 xpath 一样使用层级关系进行定位:
- # 使用 CSS 通过 标签定位
- driver.find_element_by_css_selector('input').send_keys('Selenium')
- # 使用 CSS 标签属性定位
- driver.find_element_by_css_selector('input.s_ipt').send_keys('Selenium')
- driver.find_element_by_css_selector('input#kw').send_keys('Selenium')
- # 层级关系
- driver.find_element_by_css_selector("input[id='kw']").send_keys('Selenium')
- driver.find_element_by_css_selector("input[name='wd']").send_keys('Selenium')
- driver.find_element_by_css_selector("input[autocomplete='off']").send_keys('Selenium')
- # 层级关系
- driver.find_element_by_css_selector("form#form>span>input").send_keys('Selenium')
- driver.find_element_by_css_selector("form.fm>span>input").send_keys('Selenium')
- driver.find_element_by_css_selector("form[name='f']>span>input").send_keys('Selenium')
本章说的是 8 种基本定位的方法, 学会了 8 种就足够日常使用了, 其中 xpath 和 CSS 的定位方法远远不止我写的几种, 想要深入了解 xpath,CSS, 复数定位的请自行百度进行学习.
来源: https://www.cnblogs.com/Forty40/p/11418408.html