day14-测试自动化之Selenium的元素操作、浏览器操作等

news2024/12/23 14:32:12

一、元素操作

        1.1.为什么要学习操作元素的方法?

                1).需要让脚本模拟用户给指定元素输入值

                2).需要让脚本模拟人为删除元素的内容

                3).需要让脚本模拟点击操作

        1.2.元素常用操作方法

                1).click()点击方法

                2).send_keys(value) 输入方法

                3).clear() 清空方法

        1.3.提示

                1).在输入方法之前,要进行清空操作

        1.4.代码

# 导包
from selenium import webdriver
from time import sleep
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

# 获取浏览器对象
chromedriver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
service = Service(executable_path=chromedriver_path)
driver = webdriver.Chrome(service=service)


def main():
    # 打开页面
    driver.get("https://baidu.com/")

    # 百度搜索框 输入内容
    driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("美团招聘")
    # 点击百度一下按钮 进行搜索
    driver.find_element(By.CSS_SELECTOR, "#su").click()

    # 睡眠3秒钟
    sleep(3)

    # 百度搜索框 清空内容
    driver.find_element(By.CSS_SELECTOR, "#kw").clear()
    # 百度搜索框 输入内容
    driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("腾讯招聘")
    # 点击百度一下按钮 进行搜索
    driver.find_element(By.CSS_SELECTOR, "#su").click()

    # 睡眠3秒钟
    sleep(3)

    # 关闭浏览器
    driver.quit()


if __name__ == '__main__':
    main()

二、浏览器常用的操作API

        2.1.常用方法

                1).maximize_window()最大化浏览器窗口--->模拟浏览器最大化按钮

                2).set_window_size(width,height)设置浏览器窗口大小--->设置浏览器宽、高(像素点)

                3).set_window_position(x,y)设置浏览器窗口位置--->设置浏览器位置

                4).set_window_rect(x,y,width,height)设置浏览器窗口位置和窗口大小---->set_window_size和set_window_position的并集

                5).back()后退---->模拟浏览器后退按钮

                6).forward()前进-->模拟浏览器前进按钮

                7).refresh()刷新-->模拟浏览器F5刷新

                8).close()关闭当前窗口-->模拟点击浏览器关闭按钮

                9).quit()关闭浏览器驱动对象-->关闭所有程序启动的窗口

                10).title获取页面title

                11).current_ur获取当前页面URL

        2.2.提示

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

                2).driver.maximize_windowO一般为前置代码,在获取driver后,直接编写最大化浏览器

                3).dirver.refreshO应用场景:cookie会使用到

                4).dirver.close0与driver.quitO的区别

                        1.close():关闭当前窗口

                        2.quit():关闭由driver对象启动的所有窗口

        2.3.代码

# 导包
from selenium import webdriver
from time import sleep
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

# 获取浏览器对象
chromedriver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
service = Service(executable_path=chromedriver_path)
driver = webdriver.Chrome(service=service)


def main():
    # 打开页面
    driver.get("https://baidu.com/")

    # # 设置浏览器窗口大小为 400,400
    # driver.set_window_size(400,400)
    #
    # # 设置浏览器窗口位置在左上角
    # driver.set_window_position(-100,100)
    # 两者结合
    # driver.set_window_rect(-100,100,400,400)

    # # 暂停三秒钟
    # sleep(3)

    # 最大化浏览器
    driver.maximize_window()

    # 百度搜索框 输入内容
    driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("美团招聘")
    # 百度一下按钮 进行搜索
    driver.find_element(By.CSS_SELECTOR, "#su").click()

    # 睡眠3秒钟
    sleep(3)

    # 后退到前一页
    driver.back()

    # 获取当前页面标题和url
    print(driver.title)
    print(driver.current_url)

    # 暂停三秒钟
    sleep(3)

    # 前进到前一页
    driver.forward()

    # 暂停三秒钟
    sleep(3)

    # 刷新页面
    driver.refresh()

    # 暂停三秒钟
    sleep(3)

    # 后退到前一页
    driver.back()

    # 打开新闻
    driver.find_element(By.CSS_SELECTOR, ".mnav.c-font-normal.c-color-t").click()

    # 暂停三秒钟
    sleep(3)

    # 关闭当前窗口
    driver.close()

    # 睡眠3秒钟
    sleep(3)

    # 关闭浏览器
    driver.quit()


if __name__ == '__main__':
    main()

三、获取元素信息

        3.1.为什么要获取元素信息?

                1).获取元素的文本

                2).获取元素属性值

                3).判断当前元素是不是为可见状态

        3.2.获取元素信息常用方法

                1).size  返回元素大小

                2).text 获取元素的文本

                3).get_attribute("xxx")获取属性值,传递的参数为元素的属性名

                4).is_displayed()判断元素是否可见

                5).is_enabled()判断元素是否可用

                6).is_selected()判断元素是否选中,用来检查复选框或单选框是否被选中

        3.3.提示

                1).size、text:为属性,调用时无括号;如:xxx.size

                2).get_attribute一般应用场景:判断一组元素是否为想要的元素或者判断元素属性值是否正确

                3).is_displayed、is_enabled、is_selected 在特殊场景使用

        3.4.代码

# 导包
from selenium import webdriver
from time import sleep
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

# 获取浏览器对象
chromedriver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
service = Service(executable_path=chromedriver_path)
driver = webdriver.Chrome(service=service)


def main():
    # 打开页面
    driver.get("https://ssl.zc.qq.com/v3/index-chs.html?type=0")

    # 输出欢迎注册QQ的文本
    print(driver.find_element(By.CSS_SELECTOR, "div[data-bind='visible: isQQ() || isQQMail() || isMail()'] div:nth-child(1)").text)

    # 输出昵称框的大小
    print(driver.find_element(By.CSS_SELECTOR, "#nickname").size)

    # 判断密码框是否可用
    # class ="password error"
    print(driver.find_element(By.CSS_SELECTOR, "#password").get_attribute("class"))

    # 判断用户协议是否被选中
    print(driver.find_element(By.CSS_SELECTOR,"#agree").is_selected())

    # 判断密码框是否可见
    print(driver.find_element(By.CSS_SELECTOR, "#password").is_displayed())

    # 判断密码框是否可用
    print(driver.find_element(By.CSS_SELECTOR, "#password").is_enabled())

    # 睡眠3秒钟
    sleep(3)

    # 关闭浏览器
    driver.quit()


if __name__ == '__main__':
    main()

四、鼠标操作

        4.1.为什么要操作鼠标?

                1).现在Web产品中存在丰富的鼠标交互方式,作为一个web自动化测试框架,需要应对这些鼠标操作的应用场景

        4.2.鼠标操作的方法

                1).说明:在Selenium中将操作鼠标的方法封装在ActionChains类中

                2).实例化对象:action=ActionChains(driver)

                3).方法

                        3.1).context_click(element)右击--->模拟鼠标右键点击效果

                        3.2).double_click(element)双击--->模拟鼠标双击效果

                        3.3).drag_and_drop(source,target)拖动--->模拟鼠标拖动效果(移动端测试比较常用)

                        3.4).move_to_element(element)悬停--->模拟鼠标悬停效果

                        3.5).perform()执行--->此方法用来执行以上所有鼠标操作

                                1.说明:在ActionChains类中所有提供的鼠标事件方法,在调用的时侯所有的行为都存储在ActionChains对象中,而performO方法就是真正去执行所有的鼠标事件

                                2.强调:必须调用performO方法才能执行鼠标事件

        4.3.提示

                1).selenium框架中虽然提供了,右击鼠标方法,但是没有提供选择右击菜单的方法,可以通过发送快捷键的方式解决 (经测试,谷歌浏览器不支持)。

                2).鼠标操作方法:必须调用preform()才能执行

        4.4.代码


# 导包
from selenium import webdriver
from time import sleep

from selenium.webdriver import ActionChains
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

# 获取浏览器对象
chromedriver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
service = Service(executable_path=chromedriver_path)
driver = webdriver.Chrome(service=service)


def main():
    # # 打开页面
    # driver.get("https://ssl.zc.qq.com/v3/index-chs.html")
    #
    # # 实例化鼠标对象
    # action = ActionChains(driver)
    #
    # # 定位账号框右键,预期结果 出现选择
    # action.context_click(driver.find_element(By.XPATH,"//*[@id='nickname']"))
    #
    # # 执行鼠标操作
    # action.perform()
    #
    # # 睡眠2秒钟
    # sleep(2)
    #
    # # 发送用户名 admin 并进行双击,预期结果:选中admin
    # action.double_click(driver.find_element(By.XPATH,"//*[@id='nickname']").send_keys("admin"))
    #
    # # 执行鼠标操作
    # action.perform()
    #
    # # 睡眠2秒钟
    # sleep(2)
    #
    # # 移动到在“简体中文”,出现提示框
    # action.move_to_element(driver.find_element(By.XPATH,"/html/body/div[2]/div/div[2]/div/div/div[2]/div/div/div[1]/span"))
    #
    # # 执行鼠标操作
    # action.perform()
    #
    # # 睡眠2秒钟
    # sleep(2)
    #
    # # 关闭浏览器
    # driver.quit()

    # 打开网页
    driver.get("https://ad.shenshiads.com/?bd_vid=11692342316616849961")

    # 实例化鼠标对象
    actions = ActionChains(driver)

    # 定位到可拖动的东西并进行拖动(此方法通过坐标偏移量执行)
    actions.drag_and_drop_by_offset(driver.find_element(By.XPATH,"//*[@id='aff-im-root']/div[2]/div/div/div[1]"),xoffset=200,yoffset=180).perform()


if __name__ == '__main__':
    main()

五、键盘操作

        5.1.说明

                1).模拟键盘上一些3按键或者组合键的输入如:Ctrl+C、Ctrl+V

                2).selenium中把键盘的按键都封装在Keys类中

        5.2.Keys类

                1).导包:From selenium.webdriver.common.keys import Keys

        5.3.常用的键盘操作

                1).send_keys(Keys.BACK_SPACE)删除键(BackSpace)

                2).send_keys(Keys.SPACE)空格键(Space)

                3).send_keys(Keys.TAB)制表键(Tab)

                4).send_keys(Keys.ESCAPE)回退键(Esc)

                5).send_keys(Keys.ENTER)回车键 (Enter)

                6).send_keys (Keys.CONTROL,'a)全选 (Ctrl+A)

                7).send_keys (KeyS.CONTROL,'c)复制(Ctr1+C)

        5.4.提示

                1).单键:send_keys(Keys.XXXX)

                2).组合键:send_keys(KeyS.XXXX,'x)

        5.5.代码

# 导包
from selenium import webdriver
from time import sleep
from selenium.webdriver import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common import keys
from selenium.webdriver.common.by import By

# 获取浏览器对象
chromedriver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
service = Service(executable_path=chromedriver_path)
driver = webdriver.Chrome(service=service)

def main():
    # 打开页面
    driver.get("https://ssl.zc.qq.com/v3/index-chs.html?type=0")

    # 昵称框输入admin1
    driver.find_element(By.CSS_SELECTOR, "#nickname").send_keys("admin1")

    # 暂停三秒钟
    sleep(3)

    # 昵称框删除 1 执行一次删除键(相当于敲了一次)
    driver.find_element(By.CSS_SELECTOR, "#nickname").send_keys(Keys.BACK_SPACE)

    # 暂停三秒钟
    sleep(3)

    # 昵称框全选 ctrl+a
    driver.find_element(By.CSS_SELECTOR,"#nickname").send_keys(Keys.CONTROL,"a")

    # 暂停三秒钟
    sleep(3)

    # 昵称框复制 ctrl+c
    driver.find_element(By.CSS_SELECTOR, "#nickname").send_keys(Keys.CONTROL,"c")

    # 暂停三秒钟
    sleep(3)

    # 粘贴在密码框
    driver.find_element(By.CSS_SELECTOR, "#password").send_keys(Keys.CONTROL,"v")

    # 睡眠3秒钟
    sleep(3)

    # 关闭浏览器
    driver.quit()


if __name__ == '__main__':
    main()

六、元素等待

        6.1.概念

                1).在定位页面元素时如果未找到,会在指定时间内一直等待的过程

        6.2.为什么要设置元素等待?

                1).网络速度慢

                2).电脑配置低

                3).服务器处理请求慢

        6.3.元素等待类型

                1).隐式等待

                        1.1).概念:定位元素时,如果能定位到元素则直接返回该元素,不触发等待:如果不能定位到该元素,则间隔一段时间后再去定位元素:如果在达到最大时长时还没有找到指定元素,则抛出元素不存在的异常NoSuchElementException

                        1.2).实现方式:driverimpicitly_wait(timeout)--->timeout:为等待最大时长,单位:秒

                        1.3). 说明

                                1.隐式等待为全局设置(只需要设置一次,就会作用于所有元素)

                                2.一般情况下为前置必写代码

                        1.4).代码

# 导包
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

# 获取浏览器对象
chromedriver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
service = Service(executable_path=chromedriver_path)
driver = webdriver.Chrome(service=service)


def main():
    # 打开页面
    driver.get("https://baidu.com/")

    # 网页最大化
    driver.maximize_window()

    # 隐式等待 设置十秒钟,抛出异常
    driver.implicitly_wait(10)

    # 百度搜索框 输入内容 设置一个错误异常,直接报错,说明等待失效
    driver.find_element(By.CSS_SELECTOR, "#w").send_keys("美团招聘")

    # 关闭浏览器
    driver.quit()


if __name__ == '__main__':
    main()

                2).显式等待

                        2.1).概念:定位指定元素时,如果能定位到元素则直接返回该元素,不触发等待:如果不能定位到该元素,则间隔一段时间后再去定位元素:如果在达到最大时长时还没有找到指定元素,则抛出超时异常TimeoutException。

                        2.2).在Selenium中把显式等待的相关方法封装在WebDriverWait类中

                        2.3).实现方式

                                1.导包等待类-->from selenium.webdriver.support.wait import WebDriverwait

                                2.实例化 WebDriverwait(driver, timeout, poll_frequency=0.5)

                                        (1).driver:浏览器驱动对象

                                        (2).timeout:超时的时长,单位:秒

                                        (3).poll_frequency:检测间隔时间,默认为0.5秒

                                3.调用方法until(method):直到..时

                                        (1).method:函数名称,该函数用来实现对元素的定位

                                        (2).一般使用匿名函数来实现:lambda x:x.find_element(By.ID,userA")

                                        (3).x为driver,它是WebDriverWait类将传入的driver赋值给类self_driver,until方法调用了self_driver;

                                4.element = WebDriverWait(driver, 10, 1).until(lambda x:x.find_element(By.ID,"userA")

                        2.4).提示

                                1.WebDriverWait(driver, 10,poll_frequency=0.5).until(lambdax:x.find_element(By.CSS_SELECTOR,"#kw"))返回的是一个元素

                        2.5).代码

# 导包
from time import sleep

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait

# 获取浏览器对象
chromedriver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
service = Service(executable_path=chromedriver_path)
driver = webdriver.Chrome(service=service)

def main():
    # 打开页面
    driver.get("https://baidu.com/")

    # 网页最大化
    driver.maximize_window()

    # 实例化显式等待类
    # 注意:调用until方法返回的一定是一个元素
    # 注意:此时element还不是元素,只有代码运行起来才是元素
    element = WebDriverWait(driver, 10,poll_frequency=0.5).until(lambda x:x.find_element(By.CSS_SELECTOR,"#kw"))

    # 输入值
    element.send_keys("美团招聘")

    # 暂停三秒钟
    sleep(3)

    # 关闭浏览器
    driver.quit()


if __name__ == '__main__':
    main()

        6.4.显式等待与隐式等待的区别

                1).显式等待针对单个元素生效

                2).隐式等待针对全局元素生效

七、今日学习思维导图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1990962.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手表运动报告生成以及手机展示

一.运动报告组成部分 一般一份运动健康的报告包括以下信息: 1.运动轨迹区。2.报告数据区。(运动总体概览,如距离,时长,训练表现等)3.曲线图表区。(心率曲线,海拔曲线,速度,配速曲线) 二.组成部…

PHP + Laravel + RabbitMQ + Redis 实现消息队列 (三) 消费队列在RabbitMQ和redis中的发布和订阅

发布订阅(Pub/Sub) 对于消息队列传统的模式来说,一个消费者消费一条消息,这条消息被消费之后就不会再次被其它的消费者消费。但是在发布订阅模式中,一条消息是可以被多个消费者消费的,这些消费者其实相当于…

SOMEIP_ETS_021:echoINT8

测试目的: 验证DUT在发送和接收INT8参数时,是否能够保持参数的值和顺序不变。 描述 本测试用例旨在检验DUT在处理包含INT8类型参数的SOME/IP消息时,是否能够正确地发送和接收这些参数,并且确保返回的方法响应消息中的INT8参数值…

QT(C#)-QTabWidget修改字体后Tab页显示不完整的解决方法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、 前言2、问题示例3、解决方法 1、 前言 最近一段时间学习QT的程序开发,遇到了如标题所说的问题,经过查询和摸索找到了解决方法&#xff…

CSP-J 复赛 模拟题6

1.大小写字母互换: 题目描述 由输入给定一个字符串,你的任务是将原字符串中的大写字母转换成其对应的小写字母,还要将原字符串中的小写字母转换成对应的大写字母,其余字符不变。 输出转换之后得到的新字符串。 输入格式 一行…

Flink开发语言大比拼:Java与Scala怎么选好?

在选择Apache Flink的开发语言时,Java和Scala各有优劣,最合适的选择取决于项目需求、团队技能和偏好。 Apache Flink是一个开源流处理框架,广泛应用于实时数据处理场景,如金融交易监控、网络流量分析和用户行为分析等。Flink支持J…

水泵性能参数详解

水泵性能参数之流量 水泵流量是指水泵单位时间内输送液体的体积或重量,用符号Q来表示,常用单位有m/h、m/s、L/s或t/h。 水泵铭牌上标注的流量是这台泵的设计流量,又称额定流量,水泵在额定流量下运行效率最高。 水泵流量计算公式为…

代码随想录训练营 Day23打卡 回溯算法part02 39. 组合总和 40. 组合总和II 131. 分割回文串

代码随想录训练营 Day23打卡 回溯算法part02 一、 力扣39. 组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回…

李飞飞亲自撰文,数十名科学家签署联名信,反对加州AI限制法案

AI真的已经危险到要如此监管的地步了吗? 点击访问我的技术博客https://ai.weoknow.comhttps://ai.weoknow.com 在创新的热土硅谷,李飞飞、吴恩达等 AI 科学家正在与监管部门展开一场关于安全与创新的拉锯战。 这场拉锯战的核心是一个名叫 SB-1047 的法案…

云平台部署 FunAudioLLM 语音天花板

FunAudioLLM FunAudioLLM 是阿里开源的语音处理模型,包含 SenseVoice 和 CosyVoice 两个模型。可以实现 5 种语言生成,以及 50 种语言无缝翻译,还能识别语音情绪。 FunAudioLLM:https://github.com/FunAudioLLM CosyVoice开源仓…

【Material-UI】按钮组:垂直按钮组详解

文章目录 一、按钮组概述1. 组件介绍2. 基本用法 二、垂直按钮组的应用场景1. 导航菜单2. 表单操作3. 选项切换 三、按钮组的样式定制1. 变体(Variants)2. 颜色(Colors) 四、垂直按钮组的优势1. 空间利用2. 可读性与易用性3. 视觉…

【网络基础一】几乎不讲任何网络协议细节,搭建网络基本结构

文章目录 问题认识“协议”计算机通信问题技术问题应用问题 协议分层 统编程帮助我们处理数据,网络编程帮助我们获取数据,网络配上我们写的线程池模块很快就搭建起来了。 问题 网卡是文件吗? 是的,所以未来网络通信的本质反馈到编…

Obsidian插件安装与开发

大概背景 事情的起因还是因为做笔记,我喜欢利用插件Obsidian Git自动同步笔记到Gitee,写md文档有个问题就是关于图片如何存储。 我个人习惯是将所有图片都保存到指定的文件夹下,如图👇 由于Obsidian对粘贴图片默认格式为这样的&…

ESXI加入VMware现有集群提示常规性错误

集群内有vSphere6.5和6.7的版本,都开启了EVC 这台老服务器是DELL R710添加时报错,网上查了些资料说要重装ESXI或者关闭EVC等等 最终解决方法是,给这台ESXI配置一个NTP服务器,同步系统时间,之后即可正常加入集群 往期文…

【安卓】文件存储

文章目录 将数据存储到文件中从文件中读取数据 文件存储是Android中最基本的数据存储方式,它不对存储的内容进行任何格式化处理,所有数据都是原封不动地保存到文件当中的,因而它比较适合存储一些简单的文本数据或二进制数据。如果你想使用文件…

家庭教育—情绪教育:塑造孩子情绪智力的金钥匙

文章目录 1. 背景介绍2. “1310镇静”方法的介绍3. 方法的科学依据4. 实施步骤5. 总结 1. 背景介绍 在快节奏的现代生活中,儿童面临着越来越多的情绪挑战。情绪教育作为素质教育的重要组成部分,越来越受到家长和教育者的重视。情绪教育不仅关乎儿童的心…

第100+20步 ChatGPT学习:R实现Lasso回归

基于R 4.2.2版本演示 一、写在前面 花了好几期分享了使用R语言实现机器学习分类,基本把常见模型都讲完了。 最后就以Lasso回归收尾得了。 Lasso回归应该很出名了,做特征变量筛选的,因此,不过多介绍。 二、R代码实现Lasso回归 …

OceanBase V4.2特性解析:MySQL模式下GIS空间表达式的场景及能力解析

1. 背景 1.1. OceanBase Mysql gis空间表达式的应用场景及能力 在OceanBase 4.1版本中,mysql模式下支持了gis数据类型以及部分空间对象相关的表达式,随着客户使用空间数据的需求日益增长,需要快速地补齐空间数据存储和计算分析的能力&#…

简单分享下Python进程

1. 单进程与多进程 理论讲解: 进程是操作系统中资源分配的基本单位,每个进程都有独立的内存空间。 多进程允许同时运行多个进程,提高CPU利用率和程序响应速度。 示例代码: import os print("当前进程ID:", os.getp…