Python+Selenium4元素交互1_web自动化(5)

news2024/9/28 3:21:55

目录

0. 上节回顾

1. 内置的等待条件

2. 元素属性

1. Python对象属性

2. HTML元素属性

3. 元素的交互

1. 输入框

2. 按钮

3. 单选框和复选框

0. 上节回顾

  • DEBUG的方式:JS断点 +Python断点
  • 编程语言提供的等待方式:sleep
  • selenium提供的等待方式:
  1. 隐式等待
  2. 显式等待
  3. 流畅等待
  • 等待条件的要求
  1. 是一个函数
  2. 接收一个参数:webdriver对象的实例
  3. 返回一个布尔值
  4. 尽量不要出现异常

1. 内置的等待条件

selenium 内置了一些判断函数,可用在需要的时候,判断页面是否就绪

例如:在 http://118.24.147.95:8086/flash.html 如果要点击按钮,等待条件有2个:

  • 元素存在
  • 元素可用
with get_webdriver() as driver:
    driver.get("http://118.24.147.95:8086/flash.html")

    def f(_):
        # 1. 元素存在
        ele = driver.find_element(By.XPATH, '//*[@id="content"]/input')
        if ele.is_enabled():  # 2.元素可用
            return True
        else:
            return False

    WebDriverWait(driver, 10).until(f)
    ele = driver.find_element(By.XPATH, '//*[@id="content"]/input')
    ele.click()

使用预期条件:可用免去函数的定义过程

  • element_to_be_clickable :判断元素可见,并且可点击
  • alert_is_present: 判断出现了alert 弹窗
with get_webdriver() as driver:
    driver.get("http://118.24.147.95:8086/flash.html")

    ele = WebDriverWait(driver, 10).until(
        element_to_be_clickable((By.XPATH, '//*[@id="content"]/input'))
    )
    ele.click()
with get_webdriver() as driver:
    driver.get("http://118.24.147.95:8086/delay_alert.html")
    ele = WebDriverWait(driver, 10).until(alert_is_present())  # 放入 等待条件
    ele.accept()  # 对弹窗,点击【确定】

所有的内置等待条件,需要加括号调用,

调用之后,返回一个函数,用这个函数,进行等待

2. 元素属性

元素的属性和交互,主要对WebElement对象的交互

  • 获取网页元素的信息:方法WebElement对象的属性
  • 对网页元素进行交互: 调用WebElement对象的方法

1. Python对象属性

with get_webdriver() as driver:
driver.get("https://www.baidu.com/")
# ele 是 WebElement 对象,代表网页中的一个元素
ele = driver.find_element(By.XPATH, '//*[@id="kw"]')
ele_keys = [
"id", # 对象的ID
"tag_name", # 元素的标签
"location", # 在页面中的位置(x,y)坐标
"size", # 元素大小
"rect", # 位置 + 大小
"parent", # WebDriver 对象
]
for key in ele_keys:
print(key)
print(getattr(ele, key))
print("-" * 20)

2. HTML元素属性

<input id="kw" name="wd" class="s_ipt" value="" maxlength="255"
autocomplete="off">
with get_webdriver() as driver:
    driver.get("https://www.baidu.com/")
    ele = driver.find_element(By.XPATH, '//*[@id="kw"]')
    att_keys = [
        "id",
        "name",
        "class",
        "value",
        "maxlength",
        "autocomplete",
    ]
    for att in att_keys:
        print(att+":"+ele.get_attribute(att))
        print("-" * 20)

问题: 如何获取元素的HTML源码?

print(ele.get_attribute('outerHTML')) # 通过特殊属性,获取源码

如何获取浏览器的HTML源码?

print(driver.page_source) # 获取网页源码

3. 元素的交互

不同的元素,它支持的交互方式可能是不一样的,所以要区别对待

1. 输入框

输入框有2中实现方式

<input value="input标签实现的输入框">
<textarea>textarea标签实现的输入框</textarea>

 

输入的交互方法:

  • ele.clear() # 清除内容
  • ele.send_keys("new content") # 输入内容
  • ele.is_displayed()) # 是否显示
  • ele.is_enabled()) # 是否可用
with get_webdriver() as driver:
    driver.get("file:///F:/pythonWorkspace/UI_P39_Selenium4/index.html")

    ele = driver.find_element(By.XPATH, "//input")
    ele.clear()  # 清除内容
    ele.send_keys("new content")  # 输入内容
    ele.is_displayed()  # 是否显示
    ele.is_enabled()  # 是否可用
    ele.screenshot("a.png")  # 对元素进行截图

2. 按钮

按钮有多种实现方式

 

进行隐藏一下

<a href="javascript:;" onclick="btn_on_click(this)">a标签实现的按钮</a>
<hr />
<input type="button" onclick="btn_on_click(this)" value="input标签实现的按钮"/>
<hr />
<button onclick="btn_on_click(this)" >button标签实现的按钮</button>
<script>
function btn_on_click(event){
console.log(event);
alert("你点到我了!");
}
</script>

按钮的交互方法:

  • ele.click() # 鼠标 左键 单击
  • ele.is_displayed()) # 是否显示
  • ele.is_enabled()) # 是否可用
<a href="javascript:;" onclick="btn_on_click(this)">a标签实现的按钮</a>
<hr />
<input type="button" onclick="btn_on_click(this)" value="input标签实现的按钮" hidden=true/>
<hr />
<button onclick="btn_on_click(this)" disabled=true >button标签实现的按钮
</button>
<script>
function btn_on_click(event){
console.log(event);
alert("你点到我了!");
}
</script>
with get_webdriver() as driver:
    driver.get("file:///F:/pythonWorkspace/UI_P39_Selenium4/index2.html")

    for tag_name in ["a", "input", "button"]:
        try:
            ele = driver.find_element(By.XPATH, f"//{tag_name}")
            print("是否可见:", ele.is_displayed())
            print("是否可用:", ele.is_enabled())
            ele.click()  # 点击按钮
            # 按钮被禁用的时候,click 没有报错,但其实也是点击失败
            driver.switch_to.alert.accept()  # 处理弹窗
        except Exception as e:
            print(e)
            print("交互失败")

        print("-" * 20)

在selenium 中使用JS进行元素点击

  • ele.click() # selenium 提供 点击按钮
  • driver.execute_script("return arguments[0].click()", ele) # js 进行点击

对于被遮挡的元素,selenium的点击可能会失败,这时候换成js代码

如点一下 个人中心 遮挡 登录按钮 

with get_webdriver() as driver:
    driver.get("http://101.34.221.219:8010/")
    # 出现遮挡
    driver.find_element(By.XPATH, "/html/body/div[2]/div/ul[2]/div[1]/div/a").click()
    # 点击登录按钮
    ele = driver.find_element(By.XPATH, "/html/body/div[2]/div/ul[1]/div/div/a[1]")
    # ele.click() # 预期失败
    driver.execute_script("return arguments[0].click()", ele)  # 通过JS实现点击

不能点击的场景如下:

手动不能点击

selenium不能点击

js代码不能点击

底层:控制鼠标的移动和点击

 如:上图 手动能点击 但是页面被遮挡 selenium不能点击

如上图:js代码不能点击

selenium点击元素的原理:

  • 定位元素
  • 找到元素 x,y坐标
  • 把鼠标移动 x,y坐标中心 (可用手动调整坐标,模拟真人操作)
  • 按下鼠标

3. 单选框和复选框

单选框和复选框都是input标签实现的,只是type不同

 

<!--多选框 -->
<input type="checkbox" name="check_1" value="1"/>
<br>
<input type="checkbox" name="check_1" value="2"/>
<hr/>
<!--单选框 -->
<input type="radio" name="check_2"/>
<input type="radio" name="check_2" />

单选复选框的交互方法:

  • ele.click() # 鼠标 左键 单击
  • ele.is_displayed()) # 是否显示
  • ele.is_enabled()) # 是否可用
  • ele.is_selected() # 本元素是否被选中
with get_webdriver() as driver:
    driver.get("file:///F:/pythonWorkspace/UI_P39_Selenium4/index3.html")
    ele = driver.find_element(By.XPATH, "/html/body/input[1]")
    print("是否选中:", ele.is_selected())
    ele.click()
    print("是否选中:", ele.is_selected())

对于单选复选框来说,click是【切换状态】,如之前是选中,点击之后反而是没选中 在点击之前,建议 先判断状态

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

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

相关文章

CDGA|浅谈“以治促用,以用促治”的数据治理战略

数据治理夯实企业数字化转型基础。采取“以治促用&#xff0c;以用促治”的数据治理战略&#xff0c;可以充分释放了企业核心运行要素的活力。 “以治促用”是指通过建立在数据治理链路及用户多维评估系统的基础上&#xff0c;对数据资产重新进行价值识别&#xff0c;推进高价值…

30岁测试开发年薪不足50万,被面试官嘲讽混得太差?

近日&#xff0c;有网友发帖称&#xff1a;“30岁去应聘测试开发&#xff0c;拿不到七八十万的年薪确实有点丢人了&#xff0c;还被面试官diss混得太差了”&#xff0c;网友们看完都炸了。 来看看网友们都是怎么说的。 有网友说&#xff1a; 扯淡 有网友气到&#xff1a; 那拿…

接口自动化

为了实现真正意义上的接口自动化&#xff0c;一般使用yaml文件存储测试用例&#xff0c;代码调用里面的数据来发送请求 Controller RequestMapping("/send") public class Login {ResponseBodyRequestMapping("/login")public State login(String name,Str…

ES6-ES11基本全部语法

在进入es6语法之前&#xff0c;先走一波es5遍历迭代Api&#xff0c;&#xff0c;它们的作用&#xff0c;应用场景&#xff0c;参数&#xff0c;以及返回值分别是什么。&#xff08;forEach、map、some、every、filter&#xff09;我们统一设定一个初始数组&#xff1a;let arra…

Prophet 处理时间序列数据

Prophet 处理时间序列数据 flyfish 论文地址 https://peerj.com/preprints/3190/ 官网 https://facebook.github.io/prophet/ 源码地址 https://github.com/facebook/prophet hon import pandas as pd from prophet import Prophet df pd.read_csv(https://raw.githubuse…

2月23号作业

题目&#xff1a;题目一&#xff1a;通过操作Cortex-A7核&#xff0c;串口输入相应的命令&#xff0c;控制LED灯进行工作--->上传CSDN 1.例如在串口输入led1on,开饭led1灯点亮 2.例如在串口输入led1off,开饭led1灯熄灭 3.例如在串口输入led2on,开饭led2灯点亮 4.例如在串口输…

[HarekazeCTF2019]Easy Notes

知识点&#xff1a;session 反序列化&#xff0c;代码审计代码分析 flag.php 中有个 is_admin 函数的判断。 在 lib.php 中有 is_admin 函数&#xff0c;需要 session[admin] 为 true&#xff0c;或者通过文件读取的方式。 在 index.php 中的 include 并不能使用伪协议读取 …

JVM回顾与Java虚拟机的内存管理

目录 什么是JVM&#xff1f; 主流虚拟机 JVM与操作系统关系 JVM、JRE、JDK的关系 Java程序的执行过程 JVM翻译字节码有三种执行方式 Java虚拟机的内存管理 JVM整体架构图 JVM运行时内存 Java7和Java8内存结构的不同主要体现在方法区的实现 对于Java8&#xff0c;HotSp…

Hadoop MapReduce基本概念与详细流程

Hadoop MapReduce是Hadoop 中一个批量计算的框架&#xff0c;在整个mapreduce作业的过程中&#xff0c;包括从数据的输入&#xff0c;数据的处理&#xff0c;数据的数据输入这些部分&#xff0c;而其中数据的处理部分就要map&#xff0c;reduce&#xff0c;combiner等操作组成。…

刚接手的APP项目需要优化,需要从哪些方向入手?

对于每个Android 开发团队来说产品上线&#xff0c;是让人喜忧参半的一件事。**喜指的是&#xff1a;付出了大量的时间&#xff0c;产品终于上线了&#xff1b;而忧指的是&#xff1a;担心中间会不会出现一些性能相关的问题&#xff0c;比如卡顿、内存泄漏、崩溃……等&#xf…

干翻 nio ,王炸 io_uring 来了 !!(图解+史上最全)

大趋势&#xff1a;全链路异步化&#xff0c;性能提升10倍 随着业务的发展&#xff0c;微服务应用的流量越来越大&#xff0c;使用到的资源也越来越多。 在微服务架构下&#xff0c;大量的应用都是 SpringCloud 分布式架构&#xff0c;这种架构总体上是全链路同步模式。 全链…

java 抽象类 详解

目录 一、抽象类概述&#xff1a; 二、抽象方法 : 1.概述 : 2.应用 : 3.特点 : 三、抽象类特点 : 1.关于abstract关键字 : 2.抽象类不能被实例化&#xff0c;只能创建其子类对象 : 3.抽象类子类的两个选择 &#xff1a; 四、抽象类的成员 : 1.成员变量 : 2.成员方…

趣味三角——第12章——tanx

第12章节 tanx In his very numerous memoires, and especially in his great work, Introductio in analysin infinitorum (1748), Euler displayed the most wonderful skill in obtaining a rich harvest of results of great interest. . . . Hardly any other work …

业务单据堆积如山?如何提升会计做账效率?

某集团以“创建现代能源体系、提高人民生活品质”为使命&#xff0c;形成了贯通下游分销、中游贸易储运、上游生产的清洁能源产业链和涵盖健康、文化、旅游、置业的生命健康产品链。目前&#xff0c;某集团在全国21个省&#xff0c;为超过2681万个家庭用户、21万家企业提供能源…

Android:同步屏障的简单理解和使用

同步屏障的简单理解和使用1、背景2、何为同步屏障&#xff1f;2.1、 发送屏障消息——postSyncBarrier2.2、发送异步消息2.3、处理消息2.4、移除屏障消息——removeSyncBarrier2、系统什么时候添加同步屏障&#xff1f;参考1、背景 这里我们假设一个场景&#xff1a;我们向主线…

网狐服务端C++引入http功能剖析

旗舰版本的网狐服务端及以前的版本都是没有http解析功能的&#xff0c;导致就是web后台改了配置不能及时通知到游戏里面去&#xff0c;以至于很多小公司拿这种框架来开发的变通的方案就是用定时器不定时去刷数据库&#xff0c;导致多少个功能就有多少个定时去刷新&#xff0c;代…

0基础学习软件测试难么

0基础开始学习任何一样事情都是有一定难度的&#xff0c;但是也要有对比&#xff0c;软件测试相比于IT行业其他学科已经算是容易入门的了&#xff0c;就看你个人的学习方法&#xff0c;找的学习资源以及你的自制力。 正确学习方法路径 “我一听就懂&#xff0c;一敲就废&…

【Spring的事务传播行为有哪些呢?Spring事务的隔离级别?讲下嵌套事务?】

如果你想寻求一份与后端相关的开发工作&#xff0c;那么关于Spring事务相关的面试题你就不能说不会并且不能不知道&#xff1f; 人生如棋&#xff0c;我愿为卒&#xff0c;行动虽慢&#xff0c;可谁曾见我后退一步&#xff1f; 一.Spring中声明事务的方式 1.1 编程式事务 编程…

Android Gradle脚本打包

1、背景资料 1.1 Android-Gradle-Groovy-Java-JVM 之间的关系 1.2 Android Gradle Plugin Version版本 与 Gradle Version版本的对应关系 Android Gradle Plugin Version版本Gradle Version版本1.0.0 - 1.1.32.2.1 - 2.31.2.0 - 1.3.12.2.1 - 2.91.5.02.2.1 - 2.132.0.0 -…

WFP网络过滤驱动-限制网站访问

文章目录前言WFP入门介绍WFP基本架构名词解释代码基本结构代码示例前言 WFP Architecture - Win32 apps | Microsoft Learn是一个网络流量处理平台。WFP 由一组连接到网络堆栈的钩子和一个协调网络堆栈交互的过滤引擎组成。 本文使用WFP&#xff0c;实现了一个网络阻断的demo…