Web页面获取元素方法-selenium4 UI自动化

简介

Selenium是一个用于Web应用程序测试的工具,Selenium测试直接运行在浏览器中。
Selenium RC 是Selenium家族的核心部分。Selenium RC 支持多种不同语言编写的自动化脚本测试,通过Selenium RC服务器作为代理服务器去访问应用,从而达到测试的目的。
Selenium RC分为Client Libraries和Selenium Server。Client Libraries库主要用于编写测试脚本,用来控制Selenium Server的库。
Selenium Server 负责控制浏览器行为。总的来说,Selenium Server 包括三个部分:Launcher、Http Proxy和Core。其中,Selenium Core是被Selenium Server嵌入到浏览器页面中。其实Selenium Core就是一堆JavaScript函数的集合,即通过这些javascript函数我们才能实现用程序对浏览器的操作。Launcher用于启动浏览器,把Selenium Core加载到浏览器页面当中,并把浏览器的代理设置为Selenium Server的Http Proxy。
2004年selenium诞生
2006年webdriver诞生
2008年selenium与webdriver合并selenium2.0
2016年selenium3.0诞生
2021年selenium4.0诞生

1、环境搭建

1、安装

详细请访问:https://blog.csdn.net/qq_40207262/article/details/129684795------>环境搭建

2、升级

升级依赖关系

使用 Python 的最重要变化是所需的最低版本,Selenium 4 将至少需要Python 3.7 或更高版本。
在python环境下,基于pip命令行做升级的话, 你可以执行:

1、在python3.7+环境下

执行如下命令会自动安装selenium4以上最新版。

pip3 install selenium

如果需要安装selenium3的相关版本,需要指定版本安装。

pip3 install selenium==3.14.0

如果在python3.7以上环境,但是pip版本在19以下,会出现依赖问题,而导致安装最新版selenium失败的问题,解决方法就是升级pip。、

python -m pip install --upgrade pip

或者通过get-pip.py文件升级,将其下载到本地:d:\get-pip.py
可以通过执行该文件升级pip,主要用于pip崩溃后的重装和升级。

python d:\get-pip.py
2、在python3.6环境以下

执行如下命令会自动安装selenium3.0系列版本。

pip3 install selenium

2、新旧版本的差异

Selenium 4 移除了对旧协议的支持,并在引擎盖下默认使用 W3C WebDriver 标准。对于大多数情况,此实施不会影响最终用户,主要的例外是Capabilities和Actions类。

1、capabilities的更新

如果测试功能的结构不符合 W3C,可能会导致会话无法启动,以下是 W3C WebDriver 标准功能列表:

browserName
browserVersion(代替version)
platformName(代替platform)
acceptInsecureCerts
pageLoadStrategy
proxy
timeouts
unhandledPromptBehavior
上面列表中未包含的任何功能都需要包含供应商前缀。这适用于浏览器特定功能以及云供应商特定功能。例如,如果您的云供应商为您的测试使用build和name功能,您需要将它们包装在一个cloud:options块中(与您的云供应商核对适当的前缀)。

旧版本的写法(selenium3)
caps = {}
caps[‘browserName’] = ‘firefox’
caps[‘platform’] = ‘Windows 10’
caps[‘version’] = ‘92’
caps[‘build’] = my_test_build
caps[‘name’] = my_test_name
driver = webdriver.Remote(cloud_url, desired_capabilities=caps)
新版本的写法(selenium4)
from selenium.webdriver.firefox.options import Options as FirefoxOptions
options = FirefoxOptions()
options.browser_version = ‘92’
options.platform_name = ‘Windows 10’
cloud_options = {}
cloud_options[‘build’] = my_test_build
cloud_options[‘name’] = my_test_name
options.set_capability(‘cloud:options’, cloud_options)
driver = webdriver.Remote(cloud_url, options=options)

2、executable_path的更新

executable_path 已弃用, 请传递一个服务对象。
旧版本的写法(selenium3):
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_experimental_option(“excludeSwitches”, [“enable-automation”])
options.add_experimental_option(“useAutomationExtension”, False)
driver = webdriver.Chrome(executable_path=CHROMEDRIVER_PATH, options=options)
新版本的写法(selenium4):
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
options = webdriver.ChromeOptions()
options.add_experimental_option(“excludeSwitches”, [“enable-automation”])
options.add_experimental_option(“useAutomationExtension”, False)
service = ChromeService(executable_path=CHROMEDRIVER_PATH)
driver = webdriver.Chrome(service=service, options=options)

3、定位元素方法的更新

旧版本的写法(selenium3):
driver.find_element_by_class_name(“className”)
driver.find_element_by_css_selector(“.className”)
driver.find_element_by_id(“elementId”)
driver.find_element_by_link_text(“linkText”)
driver.find_element_by_name(“elementName”)
driver.find_element_by_partial_link_text(“partialText”)
driver.find_element_by_tag_name(“elementTagName”)
driver.find_element_by_xpath(“xpath”)
新版本的写法(selenium4):
from selenium.webdriver.common.by import By
driver.find_element(By.CLASS_NAME,“xx”)
driver.find_element(By.CSS_SELECTOR,“xx”)
driver.find_element(By.ID,“xx”)
driver.find_element(By.LINK_TEXT,“xx”)
driver.find_element(By.NAME,“xx”)
driver.find_element(By.PARITIAL_LINK_TEXT,“xx”)
driver.find_element(By.TAG_NAME,“xx”)
driver.find_element(By.XPATH,“xx”)

多个元素把element替换成elements,都响应跟单个元素定位一样的新的写法

4、Selenium 4新增了相对定位

在Selenium 4中带来了相对定位这个新功能,在以前的版本中被称之为"好友定位 (Friendly Locators)"。它可以帮助你通过某些元素作为参考来定位其附近的元素。比较类似xpath的轴定位

如何工作

Selenium是通过使用JavaScript函数返回对应元素的各种属性例如:右toRightOf(),左toLeftOf(),下below() ,上above() 、附近near()。
现在可用的相对定位有:
above 元素上
below 元素下
toLeftOf 元素左
toRightOf 元素右
near 附近
findElement 方法现在支持with(By)新方法其可返回RelativeLocator相对定位对象。

3、八大元素定位法

1、By.ID

在网页HTML中发现有一个元素刚好有id属性,很幸运,因id基本上需要唯一,不然Doc会出现未知异常。我们可以使用其定位出来这元素来实现对应操作。因为它是唯一的,所以一般可以使用find_element()来定位

driver.find_element(By.ID,'kw')

2、By.NAME

在网页HTML中发现有一个元素有name属性,也很幸运,因为开发能添加name,也是要给其标记,将其与其他元素区别。我们可以使用其定位出来这元素来实现对应操作。

driver.find_element(By.NAME, 'wd')

3、By.CLASS / By.CLASS_NAME

网页HTML一般都会有class属性,前端开发者会用其来归类批量添加样式,所以它可能不是唯一的标识。这里我们可能会使用find_elements()来获取


driver.find_elements(By.CLASS, 'navigation-right')

或者

driver.find_elements(By.CLASS_NAME, 'navigation-right')

4、By.TAG_NAME

tag是网页HTML中的标记,HTML由标记组成,一个标记就是一个元素,所以它基本上不会唯一,所以也使用find_elemenets()来获取

driver.find_elements(By.TAG_NAME, 'dl')

5、By.LINK_TEXT / By.PARTIAL_LINK_TEXT

Link表示包含有属性href = “https://www.xxxxxxx.com”元素,可以通过linktext定位,linktext是页面上展示的文字。它还可以部分linktext定位

driver.find_element(By.LINK_TEXT, 'Java')
driver.find_element(By.PARTIAL_LINK_TEXT, '人工智')

参数一By.LINK_TEXT表示全部匹配linktext定位找到元素,参数二值是页面这个链接的全部文案‘Java’
参数一By.PARTIAL_LINK_TEXT表示模糊匹配linktext定位找到元素 ,参数二值是页面这个链接部分文案‘人工智’

6、By.XPATH

xpath是XML路径定位器,HTML与XML相似,所以也可以用xpath来定位,这个相对于前面的来说,需要大家掌握一些xpath的理论知识。
在这里插入图片描述

driver.find_element(By.XPATH, '//*[@id="www-home-right"]/div[1]/div[2]/div[1]/div/span')

表达式如上,xpath的强大使用方法详细请查看:
https://blog.csdn.net/qq_40207262/article/details/129713817---->xpath

7、By.CSS_SELECTOR

css是前端样式,这里说的css定位是用css样式里定位元素用的方法叫做css选择器。
符号.代表class, 符号 # 代表id, 路径空格写tag名
它与xpath一样,可以定位到任何元素,也可以直接通过F12的copy selector来取 得元素的css选择器

driver.find_element(By.CSS_SELECTOR,"#www-home-right > div.www-home-silde")

表达式如上,xpath的强大使用方法详细请查看:
https://blog.csdn.net/qq_40207262/article/details/129713817—>css selector

8、js执行

js不是定位器
js是javascript,是可以独以运行的脚本;不使用selenium的方法,进行页面元素的点击、输入、拖拽等等操作,像如果对js使用很熟练,那么也就完全不需要管上面的定位方式。全部可以使用js来实现页面元素的各种操作。
像滚动条拖拽是没法用元素定位操作的,只能使用js

driver.execute_script('document.documentElement.scrollTop=10000')

执行定位:

target =driver.execute_script("return document.getElementById('help')")
driver.execute_script("arguments[0].scrollIntoView();", target)

表达式如上,xpath的强大使用方法详细请查看:
https://blog.csdn.net/qq_40207262/article/details/129713817—>js执行

9、Selenium 4相对定位

相对定位和xpath的轴定位雷同。
方法:

需要导包:包内包含两个方法 with_tag_namelocate_with及一个类RelativeBy
因为两个方法的返回都是调用的RelativeBy类 所以直接调用两个方法即可

from selenium.webdriver.support.relative_locator import locate_with, with_tag_name

以百度产品大全页面为例:
在这里插入图片描述

above 以上
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.relative_locator import with_tag_name, locate_with

driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
# driver.get('http://120.55.190.222:38090/#/pms/addProduct')
driver.get("https://www.baidu.com/more/")
# 定位营销中心
xueyuan = driver.find_element(By.LINK_TEXT, '百度技术学院')
print(xueyuan.text)

# 定位小度商城
baidushop = locate_with(By.TAG_NAME, 'a').above(xueyuan)  #定方位
baidushop_locator = driver.find_element(baidushop)  #找到位置
print(baidushop_locator.text)

locate_with(By.TAG_NAME, 'a').above(xueyuan) :通过locate_with,标签,定方位above(百度技术学院)试下同级(‘a’),判断(百度技术学院)的标签a上边位置是:(小度商城)

在这里插入图片描述
locate_with()如果查不到,可以使用with_tag_name()两者的参数稍有差异
with_tag_name() # 括号内直接写标签名
locate_with() # 和 find_element()写法一样 用到By 和 元素定位表达式

baidushop = with_tag_name('a').above(xueyuan)  #定方位
baidushop_location = driver.find_element(baidushop)  #找到位置
print(baidushop_location.text)
below 以下

同理:
tuiguang = locate_with(By.TAG_NAME,'a').below(xueyuan),在同tag_name的(技术学院)下边的是:(商业推广)

#定位商业推广
tuiguang = locate_with(By.TAG_NAME,'a').below(xueyuan)
#tuiguang = with_tag_name('a').below(xueyuan)		#或者使用with_tag_name('')
tuiguang_location = driver.find_element(tuiguang)
print(tuiguang_location.text)
to_left_of 往左

同理:但是值得注意的是:左右查询定位不是一个,是左侧或者右侧的一列,单个的可能会定位不到,如下:使用find-elements()定位

#定位营销中心
yingxiao = locate_with(By.TAG_NAME,'a').to_left_of(xueyuan)
# yingxiao1 = with_tag_name('a').to_right_of(xueyuan)
yx_location = driver.find_elements(yingxiao)
for one in yx_location:
    print(one.text)

在这里插入图片描述

to_right_of 往右

同理:右侧一列的数据,单个右侧的查询定位不准确,find_elements()去定位

# #定位度小视
du_video = locate_with(By.TAG_NAME, 'a').to_right_of(xueyuan)
dv_location = driver.find_elements(du_video)
for one in dv_location:
    print(one.text)

在这里插入图片描述
若换成a的父元素div,可以定位,但是无法精准定位我们想要的元素:
在这里插入图片描述
左右定位还需要根据具体场景使用,比如只有左右标题的状态栏,就使用左右定位比较合适:
百度首页:
在这里插入图片描述
定位地图,然后定位左侧的hao123和右侧的贴吧
在这里插入图片描述

near 附近

使用elememts定位,只能查到上下的元素,左右的查不到,不知道为什么
在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值