Selenium

webDriver的使用

下载浏览器驱动包,将其所在的目录地址,配置到环境变量path中

1
2
3
4
5
6
7
8
9
10
11
from time import sleep

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('http://www.baidu.com')

sleep(3)

driver.quit()

元素定位

让程序操作,必须先找到此元素!

f12定位,根据标签名属性层级路径定位元素

定位方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
id
name
class_name <元素的class属性定位>
tag_name <标签名>
link_text <a 超链接>
partial_link_text <a 超链接 模糊>
xPath 基于路径定位
css

定位方式
1. id
2. name
3. class_name(使用元素的class属性定位)
4. teg_name(标签名称 <标签名 .../>)
5. link_text(定位超连接 a标签)
6. partial_link_text(定位超链接 a标签 模糊)
7. xpath(基于元素路径)
8. css(元素选择器)

汇总:
1. 基于元素属性特有定位方式(id\name\class_name)
2. 基于元素标签名称定位:tag_name
3. 定位超链接文本(link_text、partial_link_text)
4. 基于元素路径定位(xpath)
5. 基于选择器(css)

id定位

1
2
3
4
5
6
7
8
9
通过元素id属性定位,id一般唯一

说明:
通过元素的id属性定位,id一般情况下在当前页面中是唯一。
方法:
driver.find_element_by_id(id)
driver.find_element(By.ID,'userA')
提示:
元素必须要有id属性。

案例:

1
2
3
4
5
6
7
8
9
10
11
12
from time import sleep

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
url = r'D:\py\8天web自动化全套测试—资料\web自动化_day01_课件+笔记+资料+代码\web自动化_day01_课件+笔记+资料+代码\02_其他资料\注册A.html'
driver.get(url)
driver.find_element(By.ID,'userA').send_keys('admin')
driver.find_element(By.ID,'passwordA').send_keys('1234')
sleep(3)
driver.quit()

​ 提示:
​ 1. 输入方法:send_keys(“输入内容”);
​ 2. 退出浏览器驱动:driver.quit();
​ 3. 打开url: driver.get(url)
​ 4. 导包:from selenium import webdriver
​ 5. 获取火狐浏览器驱动对象 driver = webdriver.Firefox()

name定位

1
2
3
4
5
6
7
说明:
通过元素的name属性来定位, name一般名称为重复。
方法:
drivr.find_element_by_name(name)
drivr.find_element(By.NAME,name)
提示:
元素必须要有name属性
1
2
3
4
5
6
7
8
9
10
11
12
13

from time import sleep

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
url = r'D:\py\8天web自动化全套测试—资料\web自动化_day01_课件+笔记+资料+代码\web自动化_day01_课件+笔记+资料+代码\02_其他资料\注册A.html'
driver.get(url)
driver.find_element(By.NAME,'userA').send_keys('admin')
driver.find_element(By.NAME,'passwordA').send_keys('1234')
sleep(3)
driver.quit()

class_name定位:

1
2
3
4
5
6
7
说明: 
通过元素的class属性来定位,class属性一般为多个值。
方法:
driver.find_element_by_class_name()
driver.find_element(By.CLASS_NAME,class_name)
提示:
元素必须要有class属性
1
2
3
4
5
6
7
8
9
10
11
from time import sleep

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
url = r'D:\py\8天web自动化全套测试—资料\web自动化_day01_课件+笔记+资料+代码\web自动化_day01_课件+笔记+资料+代码\02_其他资料\注册A.html'
driver.get(url)
driver.find_element(By.CLASS_NAME,'telA').send_keys('17861688359')
sleep(3)
driver.quit()

id、name、class区别

1
2
3
id: 一般为唯一标识符。(快速找到)
name:可以重名 (快速更改某一样式)
class:多个命名。(通过多种方式找)

遇到的问题

1
2
3
4
5
6
7
8
Python+Selenium 定位元素
drivr.find_element_by_name(name) 使用此方法去定位元素出现以下错误

Selenium - Python - AttributeError: 'WebDriver' object has no attribute 'find_element_by_name'

原因:selenium的版本太高,需要使用
driver.find_element(By.Name,name).send_keys('ChromeDriver')

tag_name定位

1
2
3
4
5
6
说明:是通过元素的标签名称来定位,标签名(查看元素时尖括号(<)紧挨着的单词或字母就是标签名)(标签名也就是元素名)
方法:driver.find_element_by_tag_name("标签名")
注意:
1. 如果页面中存在多个相同标签,默认返回第一个标签元素。
<后的第一个标签就是标签名>
如果存在多个相同的标签,则会返回第一个标签

如何获取第二个元素?

Linkl_text定位

和partial_link_text模糊定位 只能定位超链接

1
2
3
4
说明:定位超链接标签
方法:driver.find_element_by_link_text()
注意:
1. link_text:只能使用精准匹配(a标签的全部文本内容)
1
2
3
4
5
6
说明:定位超链接标签
方法:driver.find_element_by_partial_link_text()
注意:
1. 可以使用精准或模糊匹配,如果使用模糊匹配最好使用能代表唯一的关键词
2. 如果有多个值,默认返回第一个值
3. partial_link_text模糊定位(a标签的全部文本内容),但是必须能代表唯一性
1
2
3
4
5
6
7
8
9
10
11
12
from selenium import webdriver


driver = webdriver.Chrome()

driver.get(url=r'***')

driver.find_element(By.partialLinkText('访问')).click()

sleep(3)

webdriver.quit()

Xpath定位

为什么使用Xpath和Css定位?

1
2
3
4
5
Id,name,class:依赖于元素属性,如果没有属性定位方法就不能生效

Link_text和partial_link_text只适合超链接

Tag_name:只能找唯一的 标签,或者页面中多个相同的只能找到第一个相同的元素

什么是Xpath?

基于标签路径来寻找

Xml:标记语言,数据存储和传递

Xpath定位策略:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
路径-定位
1). 绝对路径:
语法:以单斜杠开头逐级开始编写,不能跳级。如:/html/body/div/p[1]/input 以/开头,一步步写到目标标签,不能跳级
2). 相对路径
语法:以双斜杠开头,双斜杠后边跟元素名称,不知元素名称可以使用*代替 以//开头,后面/就可以 想要加属性名 例如: //input[@id=’userA’] 或者 //*[@id=’userA’] 如: //input //*

路径结合元素属性-定位
语法:在Xpath中,所有的属性必须使用@符号修饰 如://*[@id='id值']

路径结合多个属性- 定位 and
语法://*[@id="id值" and @属性='属性值']

路径结合层级 -定位
语法://*[@id='父级id属性值']/input


提示:
1. 一般见识使用指定标签名称,不使用*代替,效率比较慢。
2. 无论是绝对路径和相对路径,/后面必须为元素的名称或者*
3. 扩展:在工作中,如果能使用相对路径绝对不使用绝对路径。

Xpath延伸

1
2
3
4
5
6
7
都是相对路径

//*[text()= ‘xxx’] 定义文本值等于xxx的元素 一般使用p和a标签

//*[contains(@属性,’xxx’)] @是属性 属性包含xxx的元素 //*[contains(@type,’keyword’)]

//*[starts-with(@属性,’xxx)] 定位属性以xxx开头

CSS定位

说明:

    1. CSS一种标记语言,焦点:数据的样式。控制元素的显示样式,就必须先找到元素,在css标记语言中找元素使用css选择器;
    2. css定位就是通过css选择器工具进行定位。
    3. 极力推荐使用,查找元素的效率比xpath高,语法比xpath更简单。

方法:
driver.find_element_by_css_selector()

常用测略:

​ id 选择器
​ 前提:元素是必须有id属性
​ 语法:#id 如:#passwordA

​ class 选择器
​ 前提:元素是必须有class属性
​ 语法:.class 如:.telA

​ 元素选择器
​ 语法:element 如:input (适合单标签)

​ 属性选择器
​ 语法:[属性名=属性值] 里面的数据type和name

​ 层级选择器
​ 语法:

​ p>input

​ p input
提示:>与空格的区别,大于号必须为(上下级关系)子元素,空格则不用(跨越级别)。

扩展:

  1. [属性^=’开头的字母’] # 获取指定属性以指定字母开头的元素

  2. [属性$=’结束的字母’] # 获取指定属性以指定字母结束的元素

  3. [属性*=’包含的字母’] # 获取指定属性包含指定字母的元素

XPath和CSS类型功能对比

image-20240531211845693

工具可以直接获取 firePath 谷歌复制

复制xpath:/html/body/form/div/fieldset/p[1]/input
复制最简://*[@id=”userA”]
复制CSS路径:html body form div#zc fieldset p#p1 input#userA

采用link_text 别的css

提示:

​ 虽然借助工具可以快速生成xpath路径和css语法,但是前期不建议使用。工具在智能,没有人智能。

定位一组元素
方法:driver.find_elements_by_xxx()

只有一个值也是列表

​ 返回结果:类型为列表,要对列表进行访问和操作必须指定下标或进行遍历,[下标从0开始]

扩展8种元素定位的底层实现
方式:driver.find_element(By.xxx, ‘value’)
参数说明:
By.xxx :为By类的类型 如:By.ID
value: 元素的定位值 如: “userA”

By类:需要导包 位置: from selenium.webdriver.common.by import By

元素操作

一、元素操作方法

​ 2.1 方法
​ 1). send_keys() # 输入方法
​ 2). click() # 点击方法
​ 3). clear() # 清空
​ 2.2 提示:

      1. 在输入方法之前一定要清空操作。

二、浏览器常用操作API

​ 2.1 方法
​ 1). driver.maximize_window() # 最大化浏览器
​ 2). driver.set_window_size(w, h) # 设置浏览器大小 单位像素
​ 3). driver.set_window_position(x, y) # 设置浏览器位置
​ 4). driver.back() # 后退操作
​ 5). driver.forward() # 前进操作
​ 6). driver.refresh() # 刷新操作 cookie信息刷新有用
​ 7). driver.close() # 关闭当前主窗口(主窗口:默认启动哪个界面,就是主窗口)
​ 8). driver.quit() # 关闭由driver对象启动的所有窗口
​ 9). driver.title # 获取当前页面title信息
​ 10). drive.current_url # 获取当前页面url信息

2.2 提示:

  1. driver.title 和 driver.current_url 没有括号,应用场景:一般为判断上步操作是否执行成功。

    1. driver.maximize_window() # 一般为我的前置代码,在获取driver后,直接编写最大化浏览器

    2. driver.refresh() 应用场景,在后面的cookie章节会使用到。 cookie信息刷新有用

    3. driver.close()与driver.quit()区别:
      close():关闭当前主窗口
      quit():关闭由driver对象启动的所有窗口
      提示:如果当前只有1个窗口,close与quit没有任何区别。


文章作者: 是小康呀~
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 是小康呀~ !
评论
 上一篇
2024-06-02 是小康呀~
下一篇 
2024-05-27 是小康呀~
  目录