首页 > 其他分享 >Selenium八种元素定位方法

Selenium八种元素定位方法

时间:2023-03-09 14:55:19浏览次数:34  
标签:定位 浏览器 name Selenium 元素 driver 八种 element

不论是做web项目还是app项目的UI自动化,都是去操作页面中的元素,首先我们要找到这些元素,才能操作这些的元素,那这些元素我们应该怎么来定位呢?selenium官网


一、元素定位

1、什么叫作元素?

1)元素:

  HTML网页实际上就是由许许多多各种各样的HTML元素构成的文本文件,并且任何网页浏览器都可以直接运行HTML文件。所以可以这样说,HTML元素就是构成HTML文件的基本对象,HTML元素可以说是一个统称而已。HTML元素就是通过使用HTML标签进行定义的。

2)标签:

标签就是<head>、<body>、<table>等被尖括号“<”和“>”包起来的对象,
绝大部分的标签都是成对出现的,如<table></talbe>、<form></form>。
当然还有少部分不是成对出现的,如<br>、<hr>等。

  标签就是用来标记HTML元素的。位于起始标签和结束标签之间的文本就是HTML元素的内容。

3)属性:

  为HTML元素提供各种附加信息的就是HTML属性,它总是以"属性名=属性值"这种名值对的形式出现,而且属性总是在HTML元素的开始标签中进行定义。

示例:

<html> 
     <head> <title>示例标题</title> </head> 
     <body bgcolor="red"> 
             <p>这是示例页面</p>
     </body>
</html>

在这个示例中,<p>这是示例页面</p>就是HTML元素,其中“这是示例页面”就是元素的具体内容了。

<head><title><body>等就是HTML标签,这是标签构成了HTML元素。
<body bgcolor="red">中的bgcolor="red"就是标签的属性,它定义了标签应该如何具体配置。

元素定位:就是通过元素的信息或元素层级结构来定位元素的。

谷歌浏览器,按F12出现右侧的检查栏,点击鼠标,然后再点击页面中的元素,则可以找到该元素的组成代码。
image


二、浏览器驱动

使用python启动浏览器必须依赖浏览器的驱动,常见的浏览器Chrome、Firefox、IE、Edge、Opera、Safari
Chrome浏览器驱动下载地址
Firefox浏览器驱动下载地址
IE浏览器驱动下载地址
Microsoft Edge (EdgeHTML)浏览器驱动下载地址
Opera浏览器驱动下载地址
Safari浏览器驱动:该浏览器不用下载驱动,可以直接执行代码


三、元素定位方式

Selenium提供了八种定位元素方式
1、id
2、name
3、class_name:class属性
4、tag_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)


注:结合百度的页面来使用不同的定位方式

image

1、id定位

说明:id定位就是通过元素的id属性来定位元素,HTML 规定id属性在整个HTML文档中必须是唯一的;
前提:元素有id属性

  • id定位的方法

driver.find_element_by_id(id)

  • 实例

百度首页搜索框属性中,有个id="kw"的属性,我们可以通过这个id定位到这个搜索框,在搜索框输入selenium

import time
from selenium import webdriver

# 打开浏览器驱动文件路径
driverfile_path = r'D:\pydemo\login\chromedriver.exe'
# 启动浏览器
driver = webdriver.Chrome(executable_path=driverfile_path)
# 打开百度首页
driver.get(r'https://www.baidu.com/')
# 通过id定位搜索框,并输入selenium
driver.find_element_by_id('kw').send_keys('selenium')
# 等待5秒
sleep(5)
# 退出
driver.quit()

2、name定位

说明:name定位就是根据元素name属性来定位。HTML文档中name的属性值是可以重复的。
前提:元素有id属性

  • name定位的方法

driver.find_element_by_name(name) --页面唯一name
driver.find_elements_by_name(name)[下标] --页面多个name重复,使用下标,下标从0开始

  • 实例

百度首页的搜索框属性中,有个name="wd"的属性,我们可以通过这个name定位到这个搜索框,在搜索框输入selenium

import time
from selenium import webdriver

# 驱动文件路径
driverfile_path = r'D:\pydemo\login\chromedriver.exe'
# 启动浏览器
driver = webdriver.Chrome(executable_path=driverfile_path)
# 打开百度首页
driver.get(r'https://www.baidu.com/')
# 通过name定位搜索框,并输入selenium
driver.find_element_by_name('wd').send_keys('selenium')
# 等待5秒
sleep(5)
# 退出
driver.quit()

3、class name定位

说明: class name定位就是根据元素class属性值来定位元素。HTML通过使用class来定义元素的样式
前提:元素有class属性
注意:如果class有多个属性值,只能使用其中的一个
class="bg s_ipt_wr new-pmd quickdelete-wrap" class一共4个值bg、s_ipt_wr、new-pmd、quickdelete-wrap

  • class name定位的方法

driver.find_element_by_class_name(class_name) --页面唯一class name
driver.find_elements_by_class_name(class_name)[下标] --页面多个class name重复,使用下标,下标从0开始

  • 实例

搜索框属性中,有个class="s_ipt"的属性,我们可以通过这个class定位到这个搜索框,在搜索框输入selenium

import time
from selenium import webdriver

# 驱动文件路径
driverfile_path = r'D:\pydemo\login\chromedriver.exe'
# 启动浏览器
driver = webdriver.Chrome(executable_path=driverfile_path)
# 打开百度首页
driver.get(r'https://www.baidu.com/')
# 通过class name定位搜索框,并输入selenium
driver.find_element_by_class_name('s_ipt').send_keys('selenium')
# 等待5秒
sleep(5)
# 退出
driver.quit()

4、tag name定位

说明: tag name定位就是通过标签名来定位;查看元素时尖括号(<)紧挨着的单词或字母就是标签名;
HTML本质就是由不同的tag组成,每一种标签一般在页面中会存在多个,所以不方便进行精确定位,一般很少使用。

  • tag name定位的方法

driver.find_element_by_tag_name(tag_name) --如果存在多个相同标签,则返回符合条件的第一个标签
driver.find_elements_by_tag_name(tag_name)[下标] --页面多个tag name重复,使用下标,下标从0开始

  • 实例

注:如下图我们定位百度页面的左上角的新闻是a标签,从上往下数第5个a标签,所以得出下标为4,使用find_elements_by_tag_name(tag_name)[下标]

image

import time
from selenium import webdriver

# 驱动文件路径
driverfile_path = r'D:\pydemo\login\chromedriver.exe'
# 启动浏览器
driver = webdriver.Chrome(executable_path=driverfile_path)
# 打开百度首页
driver.get(r'https://www.baidu.com/')
# 通过tag name标签a定位"新闻",并点击
driver.find_elements_by_tag_name("a")[4].click()
# 等待5秒
sleep(5)
# 退出
driver.quit()

说明:link_text定位超链接标签(a标签)--精准匹配
注意:link_text只能使用精准匹配(a标签的全部文本内容)

  • link_text定位的方法

driver.find_element_by_link_text(a标签的全部文本内容)

  • 实例

此处定位百度首页的新闻a标签,则需要用新闻的a标签中的全部文本内容:"新闻"

image

import time
from selenium import webdriver

# 驱动文件路径
driverfile_path = r'D:\pydemo\login\chromedriver.exe'
# 启动浏览器
driver = webdriver.Chrome(executable_path=driverfile_path)
# 打开百度首页
driver.get(r'https://www.baidu.com/')
# 通过link_text定位"新闻"的a标签,并点击
driver.find_element_by_link_text("新闻").click()
# 等待5秒
sleep(5)
# 退出
driver.quit()

说明:partial_link_text定位超链接标签(a标签)--模糊匹配
注意:
1.可以使用精准或模糊匹配,如果使用模糊匹配最好使用能代表唯一的关键词;
2.如果有多个值,默认返回第一个值;

  • partial_link_text定位的方法

driver.find_element_by_partial_link_text(a标签的部分文本内容)

  • 实例

有时候一个超链接的文本很长很长,我们如果全部输入,既麻烦,又显得代码很不美观,这时候我们就可以只截取一部分字符串,用这种方法模糊匹配了。
我们用这种方法来定位百度首页的"新闻"超链接,取其中一个"闻"字来进行匹配.

image

import time
from selenium import webdriver

# 驱动文件路径
driverfile_path = r'D:\pydemo\login\chromedriver.exe'
# 启动浏览器
driver = webdriver.Chrome(executable_path=driverfile_path)
# 打开百度首页
driver.get(r'https://www.baidu.com/')
# 通过partial_link_text定位搜索框,并点击
driver.find_element_by_partial_link_text("闻").click()
# 等待5秒
sleep(5)
# 退出
driver.quit()

7、xpath定位

为什么使用xpath和css定位?
1、id,name,class:依赖于元素这三个对应的属性,如果元素没有以上三个属性,定位方法不能使用;
2、link_text,partial_link_text:只适合超链接;
3、tag name: 页面中相同元素太多,定位比较复杂

1)xpath介绍
xpath(全称:XML Path Language)即 XML 路径语言,它是一门在 XML 文档中查找信息的语言,最初被用来搜寻 XML 文档,同时它也适用于搜索 HTML 文档。

2)xpath常用定位

  • 路径
    • 绝对路径:以单斜杠开头逐级开始编写,不能跳级。如: /html/body/div/p[1]/input
    • 相对路径:以双斜杠开头,双斜杠后边跟元素名称,不知元素名称可以使用代替。如://input或者// *
  • 路径结合属性:在Xpath中,所有的属性必须使用@符号修饰如: //*[@id='id值']
  • 路径结合逻辑(多个属性)://*[@id='id值' and @属性='属性值']
  • 路径结合层级://*[@id='父级id属性值']/input

Xpath拓展
//* [text()='XXX'] # 定位文本值等于XXX的元素
提示:一般适合p标签,a标签
//* [contains(@属性,'xxx')] # 定位属性包含xxx的元素【重点】
提示:contains为关键字,不可更改。
//* [starts-with(@属性,'xxx')] # 定位属性以xxx开头的元素
提示:starts-with为关键字不可更改

3)提示

  • 一般建议使用指定标签名称,不使用*代替,效率比较慢
  • 无论是绝对路径和相对路径,/后面必须为元素的名称或者*
  • 如果能使用相对路径绝对不使用绝对路径

  • xpath定位的方法

driver.find_element_by_xpath(xpath)


  • 实例
    image
import time
from selenium import webdriver

# 驱动文件路径
driverfile_path = r'D:\pydemo\login\chromedriver.exe'
# 启动浏览器
driver = webdriver.Chrome(executable_path=driverfile_path)
# 打开百度首页
driver.get(r'https://www.baidu.com/')
# 通过xpath绝对定位搜索框,并输入adb
driver.find_element_by_xpath("/html/body/div/div/div[5]/div/div/form/span/input").send_keys("adb")

# 通过xpath路径结合属性定位搜索框,并输入adb
driver.find_element_by_xpath("//*[@id='kw']").send_keys("adb")
# 等待5秒
sleep(5)
# 退出
driver.quit()

8、CSS定位

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

1)CSS定位常用策略(参考百度首页输入框)

  • id 选择器

    • 前提:元素是必须有id属性
    • 语法:#id
    • 如:#kw
  • class 选择器

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

    • 语法:element
    • 如:input
  • 属性选择器

    • 语法:[属性名=属性值]
    • 如:[autocomplete="off"]
  • 层级选择器

    • 语法:
    • p>input
    • p input
      提示:>与空格的区别,>后面跟的必须为子元素,空格则并不一定为子元素

css拓展
[属性^='开头的字母'] # 获取指定属性以指定字母开头的元素
[属性$='结束的字母'] # 获取指定属性以指定字母结束的元素
[属性*='包含的字母'] # 获取指定属性包含指定字母的元素
百度首页搜索框:
绝对路径xpath:/html/body/div/div/div[5]/div/div/form/span/input
路径结合属性xpath:// * [@id='kw']
css:#kw

  • css定位的方法

driver.find_element_by_css_selector(css)

  • 实例
import time
from selenium import webdriver

# 驱动文件路径
driverfile_path = r'D:\pydemo\login\chromedriver.exe'
# 启动浏览器
driver = webdriver.Chrome(executable_path=driverfile_path)
# 打开百度首页
driver.get(r'https://www.baidu.com/')
# 通过css中的id定位搜索框,并输入adb
driver.find_element_by_css_selector("#kw").send_keys("adb")

# 通过css中的class name定位搜索框,并输入adb
driver.find_element_by_css_selector(".s_ipt").send_keys("adb")
# 等待5秒
sleep(5)
# 退出
driver.quit()

四、常见的其他操作

1、浏览器的操作

driver = webdriver.Chrome('C:\\Program Files (x86)\\Google\Chrome\\Application\\chromedriver.exe') # 打开Chrome浏览器
driver.get("https://www.baidu.com") # 浏览器中打开地址
driver.maximize_window() # 浏览器最大化
driver.quit() # 关闭浏览器对象
driver.set_window_size(480, 800) # 设置浏览器宽480,高800
driver.back() # 浏览器后退
driver.forward() # 浏览器前进

2、常用的元素操作

driver = webdriver.Chrome('C:\\Program Files (x86)\\Google\Chrome\\Application\\chromedriver.exe') # 打开Chrome浏览器
driver.get("https://www.baidu.com") # 浏览器中打开地址

clear() 清除元素的输入内容
例如:driver.find_element_by_id("kw").clear()

send_keys() 在元素上模拟按键输入
例如:driver.find_element_by_id("kw").send_keys(u"百度")

click() 单击元素
例如:driver.find_element_by_id("su").click()

submit() 提交表单,作用同click
例如:driver.find_element_by_id("kw").submit()

3、WebElement接口常用方法

driver = webdriver.Chrome('C:\\Program Files (x86)\\Google\Chrome\\Application\\chromedriver.exe') # 打开Chrome浏览器
driver.get("https://www.baidu.com") # 浏览器中打开地址

size返回元素尺寸,使用时无括号
例如:r_size = driver.find_element_by_id("kw").size

text返回元素文本,使用时无括号
例如:r_text = driver.find_element_by_id("cp").text

get_attribute()获取该元素任意属性的内容
例如:r_attribute = driver.find_element_by_id("kw").get_attribute("class")

4、鼠标事件

context_click() # 右击事件
double_click()  # 双击事件
drag_and_drop() # 拖动事件
move_to_element() # 鼠标悬停在一个元素上
click_and_hold()  # 按下鼠标左键在一个元素上


from selenium.webdriver.common.action_chains import ActionChains # 导入ActionChains函数

# 驱动文件路径
driverfile_path = r'D:\pydemo\login\chromedriver.exe'

# 启动浏览器
driver = webdriver.Chrome(executable_path=driverfile_path)

# 打开百度首页
driver.get(r'https://www.baidu.com/')

time.sleep(2)
# 定位首页搜索框
element = dri.find_element_by_css_selector(".s_ipt")

ActionChains(driver).context_click(element).perform()
# 右击事件,ActionChains用于生成用户的行为;所有的行为都存储 actionchains 对象。
# 通过 perform()执行存储的行为。context_click(element) 右击操作,括号内的参数是元素的位置。
# perfrome()同样也是 ActionChains 类提供的的方法,通常与ActionChains()配合使用。
# 以上五种事件的使用方式一样

5、键盘事件

from selenium.webdriver.common.keys import Keys   # 使用键盘操作,要导入Keys类包

send_keys(Keys.BACK_SPACE)  # 删除键
send_keys(Keys.SPACE)  # 空格键
send_keys(Keys.TAB)    # 制表键
send_keys(Keys.ESCAPE) # 回退键ESC
send_keys(Keys.ENTER)  # 回车键
send_keys(Keys.CONTROL,'a') # 全选(Ctrl+A)
send_keys(Keys.CONTROL,'c') # 复制(Ctrl+C)
send_keys(Keys.CONTROL,'x') # 剪切(Ctrl+X)
send_keys(Keys.CONTROL,'v') # 粘贴(Ctrl+V)

6、定位iframe中的元素

# iframe标记又叫浮动帧标记,可以用它将一个HTML文档嵌入在一个HTML中显示,<iframe></iframe>所包含的内容与整个页面是一个整体,使用driver.switch_to.frame()切入到iframe中执行定位其他元素操作,操作完后使用driver.switch_to.default_content()退出iframe

driver = webdriver.Chrome('C:\\Program Files (x86)\\Google\Chrome\\Application\\chromedriver.exe') # 打开Chrome浏览器
driver.get("https://www.baidu.com") # 浏览器中打开地址

# 1、当ifram有id 或者是name时,切换iframe时把id或者name作为参数直接传入
driver.switch_to.frame("id")
driver.switch_to.frame("name")

# 2、如果没有id或者是name时,使用8大定位方法先定位iframe位置,并选取iframe
frame = driver.findelement_by_xpath( "/html/body/div[2]/div[8]/div[2]/div[3]/div/div[2]/div/iframe" );
driver.switch_to.frame(frame);

# 3、退出iframe
driver.switch_to.default_content()

7、浏览器多窗口处理

current_window_handle  # 获取当前窗口的句柄,返回字符串
current_url            # 获取当前窗口的url
window_handles         # 获取所有窗口的句柄,返回列表
execute_script("window.open(url)")          # 打开新窗口,url为新窗口的访问地址
switch_to.window(driver.window_handles[n])  # 切换到指定窗口,n表示第几个窗口,从0开始


driver = webdriver.Chrome(executable_path="../login/chromedriver.exe")  # 打开Chrome浏览器
driver.get("https://www.baidu.com/")  # 访问百度
driver.execute_script("window.open('https://www.jd.com/')")  # 打开新的窗口,访问京东
driver.switch_to.window(driver.window_handles[1])  # 切换到第2个窗口
print(driver.window_handles)  # 打印当前所有窗口的句柄,返回列表
print(driver.current_url)  # 打印当前窗口的url
print(driver.current_window_handle)  # 打印当前窗口的句柄,返回字符串

8、alert/confifirm/prompt弹框处理

1)分类

  • 页面弹框
  • 警告提示框(alert)
  • 确认消息框(confirm)
  • 提示消息框(prompt)

提示:selenium 提供switch_to.alert方法定位到alert/confifirm/prompt对话框

2)操作
  Ⅰ. 页面弹框

   页面弹框是属于HTML里面的元素,它是由用户在操作页面的时候在本页面弹出的。所以可以直接在页面上定位到

from selenium import webdriver
import time
# 引入库

driver = webdriver.Chrome(executable_path="../login/chromedriver.exe")  # 打开Chrome浏览器
driver.get("https://www.baidu.com/")  # 访问百度
driver.find_element_by_css_selector('#u1 > a.s-top-login-btn.c-btn.c-btn-primary.c-btn-mini.lb').click()  # 点击登录

time.sleep(2)  # 等待2秒钟页面渲染出来
driver.find_element_by_css_selector('#TANGRAM__PSP_4__closeBtn').click()  # 弹框出现后,我们直接定位元素操作就好了


  Ⅱ. 警告提示框(alert)

  警告消息框是必须先关闭了用户才能操作的框,它提供了一个确认按钮,以及警告消息。

alert = driver.switch_to.alert  # 切换到弹框界面
alert.accept()      # 接受警告信息
alert.text          # 得到文本信息
alert.dismiss()     # 取消对话框(如果有的话)
alert.send_keys()   # 输入值(如果有的话)

from selenium import webdriver
import time
# 引入库

driver = webdriver.Chrome(executable_path="../login/chromedriver.exe")  # 打开Chrome浏览器
driver.get("https://www.baidu.com/")  # 访问百度
driver.implicitly_wait(10)  # 设置全局等待时间,默认每0.5秒检查一次,最长10秒未检查到则超时
link = driver.find_element_by_css_selector("#s-usersetting-top")  # 定位到设置的按钮

ActionChains(driver).move_to_element(link).perform()  # 鼠标悬停到设置的按钮上

driver.find_element_by_css_selector("#s-user-setting-menu > div > a.setpref.first > span").click()  # 点击搜索设置

driver.find_element_by_css_selector("#se-setting-7 > a.prefpanelgo.setting-btn.c-btn.c-btn-primary").click()  # 点击保存设置

alert = driver.switch_to.alert  # 定位到弹框
print(alert.text)  # 打印弹框的内容
alert.accept()  # 关闭弹框操作


  Ⅲ. 确认消息框(confirm)

  确认消息框使用确认消息框可向用户问一个“是-或-否”问题,并且用户可以选择单击“确定”按钮或者单击“取消”按钮。confirm 方法的返回值为 true 或 false。该消息框也是模式对话框:用户必须在响应该对话框(单击一个按钮)将其关闭后,才能进行下一步操作。

from selenium import webdriver
import time
# 引入库

driver = webdriver.Chrome(executable_path="../login/chromedriver.exe")  # 打开Chrome浏览器
driver.get()  # 访问url

# 我们定位获取消息框的元素,点击弹出消息框
driver.find_element_by_css_selector().click()

sleep(2)  # 为了可能因为网络等问题而获取不到弹框,我们添加等待时间

# 然后我们获取消息框,赋予变量名
alert = driver.switch_to.alert

# 获取消息框文本在控制台打印
print(alert.text)

alert.accept()  # 关闭框操作,接受弹框

alert.dismiss()  # 关闭框操作,取消弹框

  Ⅳ,提示消息框(prompt)

  提示消息框 提供了一个文本字段,用户可以在此字段输入一个答案来响应您的提示。该消息框有一个“确定”按钮和一个“取消”按钮。如果您提供了一个辅助字符串参数,则提示消息框将在文本字段显示该辅助字符串作为默认响应。否则,默认文本为 "undefined"。

from selenium import webdriver
import time
# 引入库

driver = webdriver.Chrome(executable_path="../login/chromedriver.exe")  # 打开Chrome浏览器
driver.get()  # 访问url

# 我们定位获取对话框的元素,点击弹出对话框
driver.find_element_by_css_selector().click()

sleep(1)    # 为了可能因为网络等问题而获取不到弹框,我们添加等待时间

# 然后我们获取对话框,赋予变量名
alert = driver.switch_to.alert

# 获取对话框文本在控制台打印
print(alert.text)

alert.send_keys("Selenium")  # 弹出框内输入内容
alert.accept()  # 接受
print(driver.find_element_by_xpath('').text)  # 获取关闭弹窗结果

标签:定位,浏览器,name,Selenium,元素,driver,八种,element
From: https://www.cnblogs.com/lc-blogs/p/17189005.html

相关文章