selenium最全总结

selenium总结

关于selenium更新一些相关知识。官方提供了全方面的设计理念及使用方法,但是没有给出最佳实践,官方说法是浏览器的多样性很难给出最佳实践,所以后续准备梳理几个实践的代码。
看帖子的同学注意了我只是写文章自己总结用可能不是很适合初学者学习,想看详细的可以去官网看哈,虽然官网有点卡。 下面赋上官网doc地址。
官网文档地址

前言

selenium原理是什么?

Selenium 通过使用 WebDriver 支持市场上所有主流浏览器的自动化。 Webdriver 是一个 API 和协议,它定义了一个语言中立的接口,用于控制 web 浏览器的行为。 每个浏览器都有一个特定的 WebDriver 实现,称为驱动程序。 驱动程序是负责委派给浏览器的组件,并处理与 Selenium 和浏览器之间的通信。

这种分离是有意识地努力让浏览器供应商为其浏览器的实现负责的一部分。 Selenium 在可能的情况下使用这些第三方驱动程序, 但是在这些驱动程序不存在的情况下,它也提供了由项目自己维护的驱动程序。

Selenium 框架通过一个面向用户的界面将所有这些部分连接在一起, 该界面允许透明地使用不同的浏览器后端, 从而实现跨浏览器和跨平台自动化。

Selenium 设置与其他商业工具的设置完全不同。 要在自动化项目中使用 Selenium,您需要为您选择的语言安装语言绑定库。 此外,对于要自动运行并运行测试的浏览器,您将需要 WebDriver 二进制文件。

Selenium 的核心是 WebDriver,这是一个编写指令集的接口,可以在许多浏览器中互换运行。 这里有一个最简单的说明。

基于java

package dev.selenium.hello;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class HelloSelenium {
    public static void main(String[] args) {
        WebDriver driver = new ChromeDriver();

        driver.get("https://selenium.dev");

        driver.quit();
    }
}

基于python

# --*-- conding:utf-8 --*--
# @Time : 2023/4/4 下午9:03
# @Author : lw
# @File : test_one.py
# @Software : PyCharm
import time

from selenium import webdriver


driver = webdriver.Chrome("./driver/chromedriver")

driver.get("http://baidu.com")
time.sleep(5)
driver.quit()

安装Selenium可分为三个步骤:

  1. 安装Selenium类库 为你最喜爱的编程语言
  2. 配置浏览器驱动 用以驱动你的浏览器 (例如GeckoDriver用于Firefox)
  3. (可选) 设置和配置 Selenium Grid 如果你想要扩展你的测试

如果您希望从低代码/录制和播放工具开始, 请检查 Selenium IDE

完成安装后,可以在你的文档 starting page 中运行. 然后前往 WebDriver 部分 了解更多关于 使用Selenium实现浏览器自动化的信息.

一 、 环境配置

python部分:

1、为 Python 安装 selenium模块,pip install selenium

2、下载对应浏览器驱动

Chromedriver

http://npm.taobao.org/mirrors/chromedriver/

版本对照表:https://blog.csdn.net/BinGISer/article/details/88559532

Firefoxdriver

https://github.com/mozilla/geckodriver/releases

版本对照表:https://firefox-source-docs.mozilla.org/testing/geckodriver/Support.html
3、配置环境变量
设置浏览器的地址非常简单。 我们可以手动创建一个存放浏览器驱动的目录,如: F:\GeckoDriver , 将下载的浏览器驱动文件(例如:chromedriver、geckodriver)丢到该目录下。

我的电脑–>属性–>系统设置–>高级–>环境变量–>系统变量–>Path,将“F:\GeckoDriver”目录添加到Path的值中。比如:Path字段;F:\GeckoDriver

java部分

具体的依赖位于项目中的 pom.xml 文件:

    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>4.8.0</version>
    </dependency>

Gradle

具体的依赖位于项目中的 build.gradle 文件中的 testImplementation:

    testImplementation 'org.seleniumhq.selenium:selenium-java:4.8.0'

二 、selenium元素定位 (8种)

  • find_element_by_id:通过ID进行匹配查找,只返回匹配到的一个元素

  • find_element_by_name:通过name进行匹配查找,只返回匹配到的一个元素

  • find_element_by_xpath:通过xpath进行匹配查找,只返回匹配到的一个元素

  • find_element_by_link_text:通过链接内容进行匹配查找,只返回匹配到的一个元素

  • find_element_by_partical_link_text:通过部分链接内容进行匹配查找,只返回匹配到的一个元素

  • find_element_by_tag_name:通过标签名称进行匹配查找,只返回匹配到的一个元素

  • find_element_by_class_name:通过class名称进行匹配查找,只返回匹配到的一个元素

  • find_element_by_css_selector:通过CSS选择器进行匹配查找,只返回匹配到的一个元素

值得注意的是,上面方法只会匹配查找只会获取第一个元素。除了上面这些查找单个元素的方法之外,Selenium还定义查找多个元素的方法,就是element加s。

示例代码:

  • 通过id定位:
driver.find_element_by_id('kw')
# --*-- conding:utf-8 --*--
# @Time : 2023/4/4 下午9:13
# @Author : lw
# @File : test_find_element.py
# @Software : PyCharm
import time

from selenium import webdriver

url = "http://www.baidu.com"

driver = webdriver.Chrome("./driver/chromedriver")
driver.get(url=url)
el1 = driver.find_element_by_id("kw")
el1.send_keys("selenium")
el2 = driver.find_element_by_id("su")
el2.click()

time.sleep(3)
driver.quit()

访问百度浏览器并搜索selenium

关于id元素定位方式find的方式

  • 通过class name定位:
 dr.find_element_by_name("wd")
  • 通过class name定位:
dr.find_element_by_class_name("s_ipt")
  • 通过tag name定位:
dr.find_element_by_tag_name("input")
  • 通过xpath定位,xpath高级定位有N种写法,这里列几个常用写法:

首先是语法

  1. //表示相对路径 /表示绝对路径想 //*表示从任意节点匹配所有的子孙节点
  2. 点表示选择当前节点
  3. 用@加属性 表示属性定位
  4. 索引定位 用中括号加索引 ele=drvier.find_element_by_xpath(‘//span[1]’)
  5. star-with 匹配 input[stars-with(@id,‘ctrl’)]
  6. ends-with 匹配以ctrl结束的属性值 input[ends-with(@id,‘ctrl’)]
  7. contains 匹配含有ctrl的属性值 input[contains(@id,‘ctrl’)]
dr.find_element_by_xpath("//*[@id='kw']")   
dr.find_element_by_xpath("//*[@name='wd']")
dr.find_element_by_xpath("//input[@class='s_ipt']")
dr.find_element_by_xpath("/html/body/form/span/input")
dr.find_element_by_xpath("//span[@class='soutu-btn']/input")
dr.find_element_by_xpath("//form[@id='form']/span/input")
dr.find_element_by_xpath("//input[@id='kw' and @name='wd']")
#parent选取当前节点的父节点
ele2=drvier.find_element_by_xpath('//td[@class="a3"]/parent::tr')

#ancestor选取当前节点的所有先辈(父,祖父)
ele3=drvier.find_element_by_xpath('//td[@class="a3"]/ancestor::div')

#ancestor—or-self 选取当前节点及其所有先辈
ele4=drvier.find_element_by_xpath('//td[@class="a3"]/ancestor-or-self::div')

#descendant 选取当前节点的子节点(子,孙)
ele5=drvier.find_element_by_xpath('//tr[@class="a4"]/descendant::td')

#descendant-or-self 选取当前节点的子节点包括其自身
ele6=drvier.find_element_by_xpath('//tr[@class="a4"]/descendant-or-self::td')

#preceding 选取当前节点开始标签之前的所有节点
ele7=drvier.find_element_by_xpath('//tr[@class="a4"]/preceding::span')

#preceding-sibling选取当前节点之前的所有同级节点
ele8=drvier.find_element_by_xpath('//tr[@class="a4"]/preceding-sibling::span')

#following 选取文档中当前节点的结束标签之后的所有节点(不包括自己及自己的后代元素
ele9=drvier.find_element_by_xpath('//tr[@class="a4"]/following::span')

#following-sibling选取当前节点之后的所有同级节点
ele10=drvier.find_element_by_xpath('//tr[@class="a4"]/following-sibling::span')
  • 通过css定位,css定位有N种写法,这里列几个常用写法:
dr.find_element_by_css_selector("#kw")
dr.find_element_by_css_selector("[name=wd]")
dr.find_element_by_css_selector(".s_ipt")
dr.find_element_by_css_selector("html > body > form > span > input")
dr.find_element_by_css_selector("span.soutu-btn> input#kw")
dr.find_element_by_css_selector("form#form > span > input")
  • 通过link text定位:
dr.find_element_by_link_text("新闻")
dr.find_element_by_link_text("hao123")
  • 通过partial link text定位:
dr.find_element_by_partial_link_text("新")
dr.find_element_by_partial_link_text("hao")
dr.find_element_by_partial_link_text("123")

三、断言

不管是在做功能测试还是自动化测试,最后一步需要拿实际结果与预期进行比较。这个比较的称之为断言。通过我们获取title 、URL和text等信息进行断言。

属性说明
title用于获得当前页面的标题
current_url用户获得当前页面的URL
text获取搜索条目的文本信息

示例代码:

from selenium import webdriver
from time import ctime
import time
from selenium.common.exceptions import NoSuchElementException

driver = webdriver.Chrome("D:\BaiduNetdiskDownload\chromedriver.exe")
driver.implicitly_wait(10)
driver.get('https://www.baidu.com')
driver.maximize_window()

#通过ID进行匹配查找

idele1 = driver.find_element_by_xpath('//*[@id="s-hotsearch-wrapper"]/div/a[1]/div')
print(idele1.text)

idele = driver.find_element_by_id('kw')
idele.send_keys("selenium")
print(driver.title)
print(driver.current_url)
driver.quit()

打印结果

百度热榜
百度一下,你就知道
https://www.baidu.com/

四、元素等待

WebDriver通常可以说有一个阻塞API。因为它是一个指示浏览器做什么的进程外库,而且web平台本质上是异步的,所以WebDriver不跟踪DOM的实时活动状态。这伴随着一些我们将在这里讨论的挑战。

根据经验,大多数由于使用Selenium和WebDriver而产生的间歇性问题都与浏览器和用户指令之间的 竞争条件 有关。例如,用户指示浏览器导航到一个页面,然后在试图查找元素时得到一个 no such element 的错误。

这里的问题是WebDriver中使用的默认页面加载策略页面加载策略听从document.readyState在返回调用 navigate 之前将状态改为"complete" 。因为p元素是在文档完成加载之后添加的,所以这个WebDriver脚本可能是间歇性的。它“可能”间歇性是因为无法做出保证说异步触发这些元素或事件不需要显式等待或阻塞这些事件。

幸运的是,WebElement接口上可用的正常指令集——例如 WebElement.clickWebElement.sendKeys—是保证同步的,因为直到命令在浏览器中被完成之前函数调用是不会返回的(或者回调是不会在回调形式的语言中触发的)。高级用户交互APIs,键盘鼠标是例外的,因为它们被明确地设计为“按我说的做”的异步命令。

等待是在继续下一步之前会执行一个自动化任务来消耗一定的时间。

为了克服浏览器和WebDriver脚本之间的竞争问题,大多数Selenium客户都附带了一个 wait 包。在使用等待时,您使用的是通常所说的显式等待

webdriver提供了隐式等待 、显式等待、流畅等待的方式

  • 1.隐式等待:

还有第二种区别于显示等待 类型的 隐式等待 。通过隐式等待,WebDriver在试图查找_任何_元素时在一定时间内轮询DOM。当网页上的某些元素不是立即可用并且需要一些时间来加载时是很有用的。

默认情况下隐式等待元素出现是禁用的,它需要在单个会话的基础上手动启用。将显式等待和隐式等待混合在一起会导致意想不到的结果,就是说即使元素可用或条件为真也要等待睡眠的最长时间。

警告: 不要混合使用隐式和显式等待。这样做会导致不可预测的等待时间。例如,将隐式等待设置为10秒,将显式等待设置为15秒,可能会导致在20秒后发生超时。

隐式等待是告诉WebDriver如果在查找一个或多个不是立即可用的元素时轮询DOM一段时间。默认设置为0,表示禁用。一旦设置好,隐式等待就被设置为会话的生命周期。

隐式等待方式非常简单,就是driver直接调用 implicitly_wait()。implicitly_wait() 默认参数的单位为秒,本例中设置等待时长为10秒。首先这10秒并非一个固定的等待时间,它并不影响脚本的执行速度。其次,它并不针对页面上的某一元素进行等待。当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则它将以轮询的方式不断地判断元素是否被定位到。假设在第6秒定位到了元素则继续执行,若直到超出设置时长(10秒)还没有定位到元素,则抛出异常。

示例代码:

from selenium import webdriver
from time import ctime
import time
from selenium.common.exceptions import NoSuchElementException

driver = webdriver.Chrome("D:\BaiduNetdiskDownload\chromedriver.exe")
driver.implicitly_wait(10)
driver.get('https://www.baidu.com')
driver.maximize_window()

try:
    print(ctime())
    driver.find_element_by_id("kw")
    print(ctime())
    driver.find_element_by_id("kw1")

except NoSuchElementException as e:
    print(e)
finally:
    print(ctime())
    driver.quit()

打印结果

Sat Sep 12 21:56:15 2020
Sat Sep 12 21:56:15 2020
Message: no such element: Unable to locate element: {“method”:“css selector”,“selector”:“[id=“kw1”]”}
(Session info: chrome=84.0.4147.125)
Sat Sep 12 21:56:25 2020

  • 2.显式等待:

显示等待 是Selenium客户可以使用的命令式过程语言。它们允许您的代码暂停程序执行,或冻结线程,直到满足通过的 条件 。这个条件会以一定的频率一直被调用,直到等待超时。这意味着只要条件返回一个假值,它就会一直尝试和等待

由于显式等待允许您等待条件的发生,所以它们非常适合在浏览器及其DOM和WebDriver脚本之间同步状态。

为了弥补我们之前的错误指令集,我们可以使用等待来让 findElement 调用等待直到脚本中动态添加的元素被添加到DOM中:

显式等待使WebdDriver等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常TimeoutException。
(1)显示等待需要用WebDriverWait 累来构建对象,并传入driver,然后调用until()方法。
(2)像util() 中传入 expected_conditions.percence_of_element_located()
(3)注意事项:excepted_conditions.percence_of_element_located()的参数是元组,少写括号是会报错的。

示例代码;

from selenium import webdriver
import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.common.exceptions import NoSuchElementException

driver = webdriver.Chrome("D:\BaiduNetdiskDownload\chromedriver.exe")
driver.implicitly_wait(10)
driver.get('https://www.baidu.com')
driver.maximize_window()

element = WebDriverWait(driver,10,0.5).until(
    #此处注意,参数传的是元组,少括号是执行不了的
    expected_conditions.presence_of_element_located((By.ID,'kw'))
)
element.send_keys("selenium\n")
time.sleep(3)
driver.quit()
  • 流畅等待

    流畅等待实例定义了等待条件的最大时间量,以及检查条件的频率。

    用户可以配置等待来忽略等待时出现的特定类型的异常,例如在页面上搜索元素时出现的NoSuchElementException

driver = Firefox()
driver.get("http://somedomain/url_that_delays_loading")
wait = WebDriverWait(driver, timeout=10, poll_frequency=1, ignored_exceptions=[ElementNotVisibleException, ElementNotSelectableException])
element = wait.until(EC.element_to_be_clickable((By.XPATH, "//div")))

五、浏览器控制

  • 浏览器大小控制
driver = webdriver.Chrome("D:\BaiduNetdiskDownload\chromedriver.exe")
driver.implicitly_wait(10)
driver.get('https://www.baidu.com')
#最大化
driver.maximize_window()
time.sleep(2)
#最小化
driver.minimize_window()
time.sleep(2)
#指定大小
driver.set_window_size(100,100)
time.sleep(2)
driver.quit()

  • 刷新、后退、前进
driver = webdriver.Chrome("D:\BaiduNetdiskDownload\chromedriver.exe")
driver.get("http://news.baidu.com")
time.sleep(2)
driver.get('https://www.baidu.com')
#后退
driver.back()
time.sleep(2)
#前进
driver.forward()
time.sleep(2)
#刷新
driver.refresh()
time.sleep(2)
driver.quit()
  • 常用的几个方法

clear(): 清除文本。
send_keys (value): 模拟按键输入(被操作元素需要是个 input 标签)。
click(): 单击元素
size: 返回元素的尺寸。
text: 获取元素的文本。
get_attribute(name): 获得属性值。
is_displayed(): 检测该元素是否用户可见
submit()方法用于提交表单。

六、窗口截图

两种截图方式:
1.全屏截图:driver.get_screenshot_as_file(fileroot)
注意 :文件名必须是png格式的图片格式
2.元素截图:element.screenshot()

from selenium import webdriver
import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.common.exceptions import NoSuchElementException

driver = webdriver.Chrome("D:\BaiduNetdiskDownload\chromedriver.exe")
driver.get("http://www.baidu.com")
driver.implicitly_wait(10)
driver.maximize_window()

element = driver.find_element_by_id('kw')
element.send_keys('selenium')
driver.get_screenshot_as_file('.\\a.png')
element.screenshot('.\\b.png')
time.sleep(1)
driver.quit()

截图效果:
全屏截图在这里插入图片描述

七、 警告框处理

警告框处理简单来说有:
text:显示文本内容
accept() :通过
dismiss():拒绝
send_key():输入

八、鼠标事件

鼠标事件主要:
(1)需要ActionChains 类
(2)向ActionChains类注入 driver 调用方法方法中传参数element
(3)最后一定要调用perform()方法 否则不执行

单击:click(ele)
双击:double_click(ele)
拖拽:drag_and_drop(ele1,ele2)
右击:context_click(ele)

driver = webdriver.Chrome("D:\BaiduNetdiskDownload\chromedriver.exe")
driver.get("http://www.baidu.com")
driver.implicitly_wait(10)
driver.maximize_window()

element = driver.find_element_by_id('kw')
element.send_keys('selenium')
ele = driver.find_element_by_id('su')

#单击
ActionChains(driver).click(ele).perform()
ele1 =driver.find_element_by_xpath('//*[@id="result_logo"]/img[1]')
#双击
ActionChains(driver).double_click(element).perform()
#右击
ActionChains(driver).context_click(element).perform()
#拖拽
ActionChains(driver).drag_and_drop(ele1,element).perform()
 

time.sleep(2)
driver.quit()

九、键盘事件

Selenium中的Key模块为我们提供了模拟键盘按键的方法,那就是send_keys()方法。它不仅可以模拟键盘输入,也可以模拟键盘的操作。

常用的键盘操作如下:

模拟键盘按键说明
send_keys(Keys.BACK_SPACE)删除键(BackSpace)
send_keys(Keys.SPACE)空格键(Space)
send_keys(Keys.TAB)制表键(Tab)
send_keys(Keys.ESCAPE)回退键(Esc)
send_keys(Keys.ENTER)回车键(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)
send_keys(Keys.F1…Fn)键盘 F1…Fn

十、元素

文件上传

当input元素为文件类型时, 文件上传对话框可以使用Selenium处理. 例如, 在这个网页中可以发现- https://the-internet.herokuapp.com/upload 我们需要一个可用的文件,

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.implicitly_wait(10)
driver.get("https://the-internet.herokuapp.com/upload");
driver.find_element(By.ID,"file-upload").send_keys("selenium-snapshot.jpg")
driver.find_element(By.ID,"file-submit").submit()
if(driver.page_source.find("File Uploaded!")):
    print("file upload success")
else:
    print("file upload not successful")
driver.quit()

  

Web元素交互

用于操纵表单的高级指令集.

仅有五种基本命令可用于元素的操作:

点击 (适用于任何元素)
el.click()
发送键位 (仅适用于文本字段和内容可编辑元素)
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox()

    # Navigate to url
driver.get("http://www.google.com")

    # Enter "webdriver" text and perform "ENTER" keyboard action
driver.find_element(By.NAME, "q").send_keys("webdriver" + Keys.ENTER)

清除 (仅适用于文本字段和内容可编辑元素)
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()

    # Navigate to url
driver.get("http://www.google.com")
    # Store 'SearchInput' element
SearchInput = driver.find_element(By.NAME, "q")
SearchInput.send_keys("selenium")
    # Clears the entered text
SearchInput.clear()
提交 (仅适用于表单元素)

在Selenium 4中, 不再通过单独的端点以及脚本执行的方法来实现. 因此, 建议不要使用此方法, 而是单击相应的表单提交按钮.

使用选择列表元素

与其他元素相比,选择列表具有特殊的行为.

Select对象现在将为您提供一系列命令, 用于允许您与 <select> 元素进行交互.

如果您使用的是 Java 或 .NET, 请确保您在代码中已正确加载所需的包. 您可以通过GitHub查看下面示例的完整代码.

请注意,此类仅适用于 HTML 元素 selectoption. 这个类将不适用于那些通过 divli 并使用JavaScript遮罩层设计的下拉列表.

单选

这是标准的下拉对象,其只能选定一个选项.

<select name="selectomatic">
    <option selected="selected" id="non_multi_option" value="one">One</option>
    <option value="two">Two</option>
    <option value="four">Four</option>
    <option value="still learning how to count, apparently">Still learning how to count, apparently</option>
</select>

Copy

复选

此选择列表允许同时选定和取消选择多个选项. 这仅适用于具有 multiple 属性的 <select>元素.

<select name="multi" id="multi" multiple="multiple">
    <option selected="selected" value="eggs">Eggs</option>
    <option value="ham">Ham</option>
    <option selected="selected" value="sausages">Sausages</option>
    <option value="onion gravy">Onion gravy</option>
</select>
构建类

首先定位一个 <select> 元素, 然后借助其初始化一个Select 对象. 请注意, 从 Selenium 4.5 开始, 您无法针对禁用的 <select> 元素构建 Select 对象.

 select_element = driver.find_element(By.NAME, 'selectomatic')
 select = Select(select_element)
选项列表

共有两种列表可以被获取:

全部选项

获取 <select> 元素中所有选项列表:

option_list = select.options
选中的选项

获取 <select> 元素中所选中的选项列表. 对于标准选择列表这将只是一个包含一个元素的列表, 对于复选列表则表示包含的零个或多个元素.

 selected_option_list = select.all_selected_options
选项

Select类提供了三种选择选项的方法. 请注意, 对于复选类型的选择列, 对于要选择的每个元素可以重复使用这些方法.

文本

根据其可见文本选择选项

 select.select_by_visible_text('Four')

根据其值属性选择选项

 select.select_by_value('two')
序号

根据其在列表中的位置选择选项

  select.select_by_index(3)
禁用的选项

Selenium v4.5

具有 disabled 属性的选项可能无法被选择.

    <select name="single_disabled">
      <option id="sinlge_disabled_1" value="enabled">Enabled</option>
      <option id="sinlge_disabled_2" value="disabled" disabled="disabled">Disabled</option>
    </select>
 with pytest.raises(NotImplementedError):
        select.select_by_value('disabled')
取消选择选项

只有复选类型的选择列表才能取消选择选项. 您可以对要选择的每个元素重复使用这些方法.

  select.deselect_by_value('eggs')

十一、额外功能

同颜色一起工作

在测试中, 您偶尔会需要验证某事物的颜色;问题是网络上的颜色定义不是个常量. 如果有一种简单的方法可以比较颜色的十六进制与RGB呈现, 或者颜色的RGBA与HSLA呈现, 岂不美哉?

不用担心有一个解决方案:Color 类!

首先, 您需要导入该类:

from selenium.webdriver.support.color import Color
  

您现在可以开始创建颜色对象. 每个颜色对象都需要使用您颜色的字符串定义来创建. 支持的颜色定义如下:

HEX_COLOUR = Color.from_string('#2F7ED8')
RGB_COLOUR = Color.from_string('rgb(255, 255, 255)')
RGB_COLOUR = Color.from_string('rgb(40%, 20%, 40%)')
RGBA_COLOUR = Color.from_string('rgba(255, 255, 255, 0.5)')
RGBA_COLOUR = Color.from_string('rgba(40%, 20%, 40%, 0.5)')
HSL_COLOUR = Color.from_string('hsl(100, 0%, 50%)')
HSLA_COLOUR = Color.from_string('hsla(100, 0%, 50%, 0.5)')

Color类还支持在以下网址中指定的所有基本颜色定义 http://www.w3.org/TR/css3-color/#html4.

BLACK = Color.from_string('black')
CHOCOLATE = Color.from_string('chocolate')
HOTPINK = Color.from_string('hotpink')
  

如果元素上未设置颜色, 则有时浏览器会返回“透明”的颜色值. Color类也支持此功能:

TRANSPARENT = Color.from_string('transparent')

现在, 您可以安全地查询元素以获取其颜色/背景色, 任何响应都将被正确解析并转换为有效的Color对象:

login_button_colour = Color.from_string(driver.find_element(By.ID,'login').value_of_css_property('color'))

login_button_background_colour = Color.from_string(driver.find_element(By.ID,'login').value_of_css_property('background-color'))
  

然后, 您可以直接比较颜色对象:

assert login_button_background_colour == HOTPINK

或者, 您可以将颜色转换为以下格式之一并执行静态验证:

assert login_button_background_colour.hex == '#ff69b4'
assert login_button_background_colour.rgba == 'rgba(255, 105, 180, 1)'
assert login_button_background_colour.rgb == 'rgb(255, 105, 180)'

线程守卫

此类仅在Java中可用

十二、内嵌网页处理

		from time import sleep
		from selenium import webdriver
		from selenium.webdriver.common.by import By
    # 使用Chrome 浏览器
    driver = webdriver.Chrome()
    # 搜索网址
    driver.get(Url)
    driver.find_element(By.XPATH, "/html/body/div[2]/div/ul[2]/div[1]/div/a").click()
    sleep(3)
    # 定位到内嵌页面元素
    iframe = driver.find_element(
        By.XPATH, "//*[@id='common-popup-modal-login']/div/iframe"
    )
    # 切换到内嵌页面
    driver.switch_to.frame(iframe)
    sleep(1)
    driver.find_element(By.NAME, "accounts").send_keys("110")
    driver.find_element(By.NAME, "pwd").send_keys("123456")
    driver.find_element(By.XPATH, "/html/body/div[1]/form/div[4]/button").click()
    sleep(2)
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个双鱼座的测开

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值