干货 | JavaScript脚本注入,完成Selenium 无法做到的那些事

简介: 当 webdriver 遇到无法完成的操作时,可以使用 JavaScript 来完成,webdriver 提供了 execute_script() 方法来调用 js 代码。执行 js 有两种场景:- 在页面上直接执行 js- 在某个已经定位的元素上执行 jsJavaScript 是一种脚本语言,有的场景需要使用 js 脚本注入辅助我们完成 Selenium 无法做到的事情。S

当 webdriver 遇到无法完成的操作时,可以使用 JavaScript 来完成,webdriver 提供了 execute_script() 方法来调用 js 代码。
执行 js 有两种场景:

  • 在页面上直接执行 js
  • 在某个已经定位的元素上执行 js

JavaScript 是一种脚本语言,有的场景需要使用 js 脚本注入辅助我们完成 Selenium 无法做到的事情。

Selenium 可以通过 execute_script() 来执行 JavaScript 脚本。

  • driver.execute_script:同步执行 JavaScript 在当前的窗口框架下
  • js 脚本可以在浏览器的开发者工具 -> Console 中进行调试
  • 获取元素控件中的属性值

  • 与 Selenium 结合,在代码中返回 js 结果
# 获取网页性能的响应时间,js脚本中使用return代表返回获取的结果
js = "return JSON.stringify(performance.timing);"
driver.execute_script(js)

执行 JavaScript 也可以通过传参的方式传入元素信息。

element = driver.find_element(by, locator)
#arguments[0]代表所传值element的第一个参数
#click()代表js中的点击动作
driver.execute_script("arguments[0].click();",element)

还可以通过上面的方法点击被遮挡的元素。
例如:某个元素在实际的操作过程中被其他的元素遮挡,就可以使用 js 点击的方式。
自动化过程中的报错如下:

Other element would receive the click: 
<label class="custom-control-label" for="user_remember_me">...</label>

如果出现上面的错误,可以使用 js 的方式进行点击。

以企业微信为例,使用 js 点击添加图片。

代码:

#导入依赖
from selenium import webdriver
from selenium.webdriver.common.by import By


class TestWework:
    def setup(self):
        self.driver = webdriver.Chrome()
        #隐式等待
        self.driver.implicitly_wait(2)

    def test_upload(self):
        #元素定位
        element_add = self.driver.find_element\
            (By.CSS_SELECTOR, ".js_upload_file_selector")
        #执行js代码
        self.driver.execute_script\
            ("arguments[0].click();", element_add)
        self.driver.find_element_by_id('js_upload_input').send_keys('D:\project\demo1\demo.png')
        assert len(self.driver.find_elements(By.CSS_SELECTOR,'.material_pic_list_item')) == 1

    def teardown(self):
        self.driver.quit()
查看更多信息,请添加vx,ceshiren001

执行 JavaScript 脚本就先讲到这里啦,大家还想看什么内容的文章也可以留言告诉我们哦!

原文链接
更多技术分享:https://qrcode.ceba.ceshiren.com/link?name=article&project_id=qrcode&from=Aliyun&timestamp=1650785825

相关文章
|
监控 算法
独立成分分析(Independent Component Analysis,ICA)原理及代码实现
独立成分分析(Independent Component Analysis,ICA)原理及代码实现
独立成分分析(Independent Component Analysis,ICA)原理及代码实现
|
新零售 存储 分布式计算
关于用户画像那些事,看这一文章就够了
数据科学家介绍了向量化技巧,简单的数学变化可以通过可迭代对象执行。
14543 0
|
数据采集 存储 监控
探索数据治理的实践路径:构建高效、合规的数据生态系统
在当今这个数据驱动的时代,数据已成为企业最宝贵的资产之一,它不仅驱动着业务决策,还塑造着企业的竞争优势。然而,随着数据量的爆炸性增长和来源的多样化,如何有效管理这些数据,确保其质量、安全性及合规性,成为了企业面临的重大挑战。数据治理作为一套指导数据管理和使用的框架,其重要性日益凸显。本文将探讨推动数据治理的实践路径,旨在帮助企业构建高效、合规的数据生态系统。
|
JavaScript
vue2路由懒加载解决import引入报错问题
本文介绍了在Vue2项目中实现路由懒加载的方法,并解决了使用import语句进行懒加载时报错的问题。通过安装`babel-plugin-syntax-dynamic-import`插件并在项目的`.bablerc`文件中配置,可以成功实现路由组件的按需加载。同时,文章还提到了使用`webpackChunkName`为懒加载的组件指定单独的chunk名称,以避免所有组件被打包到同一个js文件中。
973 4
|
12月前
|
前端开发 JavaScript
React 标签组件 Tag
在现代Web开发中,标签(Tag)是常见的UI元素,用于分类、标记或表示状态。本文基于React框架,介绍如何创建和管理标签组件,涵盖基础使用、样式处理及常见问题与易错点。通过函数式组件定义标签,并使用CSS或CSS-in-JS进行样式处理。常见问题包括样式冲突、事件绑定错误和可关闭标签逻辑错误,提供解决方案如命名空间、CSS模块化和正确事件绑定方法。掌握这些内容有助于提高开发效率和代码质量。
346 27
|
JavaScript Java 测试技术
基于SpringBoot+Vue的动漫周边商城的详细设计和实现
基于SpringBoot+Vue的动漫周边商城的详细设计和实现
171 0
|
Java 数据库连接 API
seata回滚问题之全局异常如何解决
Seata是一款开源的分布式事务解决方案,旨在提供高效且无缝的分布式事务服务;在集成和使用Seata过程中,开发者可能会遇到不同的异常问题,本合集针对Seata常见异常进行系统整理,为开发者提供详细的问题分析和解决方案,助力高效解决分布式事务中的难题。
2012 106
|
自然语言处理 NoSQL 关系型数据库
CodeGeeX支持哪些语言?
【8月更文挑战第29天】CodeGeeX支持哪些语言?
350 4
|
数据采集 存储 Linux
2022-渗透测试-Kali Linux字典生成工具Cewl使用指南
2022-渗透测试-Kali Linux字典生成工具Cewl使用指南
2022-渗透测试-Kali Linux字典生成工具Cewl使用指南
|
编解码 算法 数据可视化
Google Earth Engine(GEE)——全球河流宽度数据集1970—2017年
Google Earth Engine(GEE)——全球河流宽度数据集1970—2017年
818 0
Google Earth Engine(GEE)——全球河流宽度数据集1970—2017年