web自动化测试-执行 JavaScript 脚本
JavaScript 是一种脚本语言,有的场景需要使用 js 脚本注入辅助我们完成 Selenium 无法做到的事情。
当 webdriver 遇到无法完成的操作时,可以使用 JavaScript 来完成,webdriver 提供了 execute_script() 方法来调用 js 代码。
执行 js 有两种场景:
在页面上直接执行 js
在某个已经定位的元素上执行 js
执行js
Selenium 可以通过 execute_script() 来执行 JavaScript 脚本。
driver.execute_script:同步执行 JavaScript 在当前的窗口框架下
js 脚本可以在浏览器的开发者工具 -> Console 中进行调试
js的返回结果
获取元素控件中的属性值
- 与 Selenium 结合,在代码中返回 js 结果
- Python 版本
# 获取网页性能的响应时间,js脚本中使用return代表返回获取的结果
js = "return JSON.stringify(performance.timing);"
driver.execute_script(js)
复制代码
- Java 版本
// 获取网页性能的响应时间,js脚本中使用return代表返回获取的结果
String js = "return JSON.stringify(performance.timing);";
JavascriptExecutor j = (JavascriptExecutor) driver;
j.executeScript(js);
复制代码
arguments传参
执行 JavaScript 也可以通过传参的方式传入元素信息,还可以通过下面的方法点击被遮挡的元素。
例如:某个元素在实际的操作过程中被其他的元素遮挡,就可以使用 js 点击的方式
- Python 版本
element = driver.find_element(by, locator)
#arguments[0]代表所传值element的第一个参数
#click()代表js中的点击动作
driver.execute_script("arguments[0].click();",element)
复制代码
- Java 版本
WebElement element = driver.findElement(By);
// arguments[0]代表所传值element的第一个参数
// click()代表js中的点击动作
JavascriptExecutor j = (JavascriptExecutor) driver;
j.executeScript("arguments[0].click();", element);
复制代码
自动化过程中的报错如下:
Other element would receive the click:
<label class="custom-control-label" for="user_remember_me">...</label>
复制代码
如果出现上面的错误,可以使用 js 的方式进行点击。
实战演示
以企业微信为例,使用 js 点击添加图片
Python 代码
#导入依赖
from selenium import webdriver
from selenium.webdriver.common.by import Byclass TestWework:def setup(self):self.driver = webdriver.Chrome()#隐式等待self.driver.implicitly_wait(10)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')) == 1def teardown(self):self.driver.quit()
复制代码
Java 代码
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;import java.util.concurrent.TimeUnit;import static org.junit.jupiter.api.Assertions.assertEquals;public class Web2Test {private static ChromeDriver driver;@BeforeAllpublic static void setUp() {System.setProperty("webdriver.chrome.driver","/driver/chrome95/chromedriver");driver = new ChromeDriver();driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);}@AfterAllpublic static void tearDown() {driver.quit();}@Testpublic void uploadTest() {// 元素定位WebElement element_add = driver.findElement(\By.cssSelector(".js_upload_file_selector"));// 执行js代码JavascriptExecutor j = (JavascriptExecutor) driver;j.executeScript("arguments[0].click();", element_add);driver.findElement(By.id("js_upload_input"))\.sendKeys("D:\\project\\demo1\\demo.png");int num = driver.findElements(By.cssSelector\(".material_pic_list_item")).size();assertEquals(num, 1);}
}
在测试工作中,JavaScript 也是经常会用到的,所以大家还是要多多练习,才能掌握的更扎实。
学习安排上
作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。
视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方进群即可自行领取。
相关文章:

web自动化测试-执行 JavaScript 脚本
JavaScript 是一种脚本语言,有的场景需要使用 js 脚本注入辅助我们完成 Selenium 无法做到的事情。 当 webdriver 遇到无法完成的操作时,可以使用 JavaScript 来完成,webdriver 提供了 execute_script() 方法来调用 js 代码。 执行 js 有两种…...

libevent笔记——简单介绍
背景 libevent libevent – an event notification library 官方定义:libevent是一个事件通知的库。更详细的介绍参考官方的就够了,这里我摘抄一下,并做一些注释 The libevent API provides a mechanism to execute a callback function whe…...

C++学习笔记-多态
多态的概念 多态的概念:通俗来说,就是多种形态, 具体点就是去完成某个行为,当不同的对象去完成时会 产生出不同的状态 。 举个例子:比如 买票这个行为 ,当 普通人 买票时,是全价买票;…...

5632: 三角形
描述平面坐标系下,给定不共线的三个点组成一个三角形,问三角形最短的边长和最长的边长各为多少?输入输入包含3行,每行两个整数,表示一个点的坐标x和y。输出输出包括2个小数,分别为最短的边长和最长的边长。…...

Java基础--IO操作
一、IO原理及分类 一、IO原理 1、I/O是Input/Output的缩写,I/O技术是非常实用的技术,用于处理设备之间的数据传输,如读写文件,网络通信等。 2、java程序中对于数据的输入/输出操作一般都是以流的方式进行 3、java.io包下提供各…...

C++多线程
目录一、C线程库1. 认识thread类2. 线程函数的参数3. this_thread二、原子操作三、C互斥锁1. mutex2. lock_guard3. unique_lock四、C条件变量1. condition_variable2. 实现两个线程交替打印奇偶数一、C线程库 1. 认识thread类 在C11之前没有多线程的概念,涉及到的…...

【Arduino使用nRF24L01 】
【Arduino使用nRF24L01 】 1. 概述2. nRF24L01 收发器模块2.1工作原理2.2 NRF24L01模块变体2.3 nRF24L01 模块引脚排列3. 如何将 nRF24L01 连接到 Arduino3.1 原理接线图3.2 Arduino 和 nRF24L01 代码3.3 代码说明4. 故障排除5. 两个NRF24L01和Arduino进行双向无线通信5.1 nRF2…...

Appium自动化测试框架是一种较为优雅的使用方式
以操作小米商城下单为例流程是 启动小米商城app, 点击分类,点击小米手机, 点击小米10 至尊版,点击加入购物车,点击确定....原脚本Copyfrom time import sleep from appium import webdriver from selenium.common.exceptions impo…...

Linux c编程之应用交互协议分析与设计
在实际编程应用中,两个或多个功能服务(模块)之间 需要通过消息交互进行协作完成用户想要的逻辑功能,这里的消息交互指的是应用层的交互。最终数据传输(无论是TCP/IP还是其它)都是以二进制形式完成,但对于应用层协议来说有两种,一种是二进制协议,一种是文本协议。不管是…...

基于YOLOv5的细胞检测实战
数据及代码链接见文末 1.任务与数据集介绍 如下图所示,我们有一个医学细胞数据集,需要从数据集中检测出三种不同的细胞。标签中已经标注了细胞的类别和位置。 我们也可以看到,三种细胞有着不同的形态和颜色,同时数据集的标签也存在没有标注到的细胞 2.数据与标签配置方…...

【经典蓝牙】蓝牙AVRCP协议分析
协议简介 蓝牙AVRCP协议是蓝牙设备之间音视频的控制协议。定义了音频/视频的控制、浏览、查询、通知等一系列的命令集。常用来蓝牙耳机对手机的音乐进行控制,以及获取手机的音乐信息等场景。AVRCP协议有两个角色,分别是controller(CT&#x…...

gin 框架初始教程
一 、gin 入门1. 安装gin :下载并安装 gin包:$ go get -u github.com/gin-gonic/gin2. 将 gin 引入到代码中:import "github.com/gin-gonic/gin"3.初始化项目go mod init gin4.完整代码package mainimport "github.com/gin-go…...

对象分配策略
对象创建后,究竟何去何从,对象在堆中又会经历哪些过程,本篇就会详细解释对象创建后直到对象被回收的整个过程。之前博主已经写过Minor GC、Major GC、Full GC的区别,而本篇也主要根据这几个GC开展。 对象回收过程流程如下图所示: 正常的对象生存过程&a…...

你可能不知道的前端监控方案
前言 现有的大部分监控方案都是针对服务端的,而针对前端的监控很少,诸如线上页面的白屏时间是多少、静态资源的加载情况如何、接口请求耗时好久、什么时候挂掉了、为什么挂掉,这些都不清楚。 因而,我们需要一个前端的页面监控系…...

java spring AOP 完全注解开发
我们先创建一个项目 然后引入java spring aop的依赖 然后 在src下创建目录 我这里 直接就叫 Aop了 下面创建一个User类 参考代码如下 package Aop;import org.springframework.stereotype.Component;Component public class User {public void add(){System.out.println(&qu…...

ctf pwn基础-4
今天是学pwn的第四天,去接触了pwn的整数溢出。 目录 基础 实例讲解 实例讲解2 基础 关于整数溢出,这里以int为例,因为我php之前搞的比较多,以为这个int也是想php一样是64,最大值是9开头的那个,闹了不少笑…...

bool与引用类型
bool与引用类型bool类型介绍与使用bool(布尔类型)大小:1个字节返回值有两个:1(true),0(false)#include<iostream>using namespace std;int main() {bool a false;bool b true;cout << "a " << a << end…...

tkinter界面的TCP通信/tkinter开启线程接收TCP
前言 用简洁的语言写一个可以与TCP客户端实时通信的界面。之前做了一个项目是要与PLC进行信息交互的界面,在测试的时候就利用TCP客户端来实验,文末会附上TCP客户端。本文分为三部分,第一部分是在界面向TCP发送数据,第二部分是接收…...

[SQL Statements] 基本的SQL知识 之DDL针对数据库的基本操作
SQL Statements SQL语句的学习 之 DDL针对数据库的基本操作 什么是database 在 MySQL 中,Database(数据库)是一组有组织的数据集合,可以存储和管理相关数据的容器。一个数据库可以包含多个表(Table)&…...

Qt的MOC机制
Qt的MOC机制 Qt扩展了C,使得开发者拥有很多方便使用的工具。如何使用Qt提供的特性呢?比如信号与槽,那就需要开发者在类中声明Q_OBJECT宏,这样程序员就能使用Qt提供的功能了。为什么这样可以呢?先从C文件的编译过程开始…...

Linux驱动——设备模型
目录 一、起源 二、新方案 2.1 sysfs: 2.2 uevent 三、代码中自动mknod 四、实例 一、起源 仅devfs,导致开发不方便以及一些功能难以支持:(硬编) 1. 热插拔(插上usb设备就立马能安装驱动) 2. 不支持…...

.NET基础加强第一课--面向对象(OO)
.NET基础加强第一课--面向对象(OO)面向对象什么是类?封装--属性封装字段2, 方法的多个参数封装成一个类3, 把一堆代码封装到一个方法中4, 将一些功能封装到几个类中5, 将一些具有共有功能封装到…...

从Linux源码角度看套接字的Listen及连接队列
今天就从Linux源码的角度看下Server端的Socket在进行listen的时候到底做了哪些事情(基于Linux 3.10内核),当然由于listen的backlog参数和半连接hash表以及全连接队列都相关,在这里也一块讲了。 Server端Socket需要Listen 众所周知,一个Serv…...

cesium: 显示闪烁的点(004)
第004个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置闪烁的点。主要是介绍entity>point 相关的属性设置 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共107行)相关API参考:专栏目标示例效果 配…...

常见代码审计工具,代码审计为什么不能只用工具?
代码审计是一种发现程序漏洞,安全分析为目标的程序源码分析方式。今天主要分享的是几款常用的代码审计工具,以及代码审计工具有哪些优缺点? 代码审计工具 seay代码审计工具,是一款开源的利用C#开发的一款代码审计工具。主要有SQ…...

es8集群模式部署
准备3台机器 192.168.1.41 192.168.1.42 192.168.1.43因为es集群有几个节点,所以我对应node1,node2,node3.这几个名称并不是主机名,而是es节点名称 2. 开始部署,基础配置 (三台都做) systemctl stop firewalld syste…...

OAuth2
1.什么是OAuth2 OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。同时,任何第三方都可以使用OAUTH认证服务,任何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP、JavaScript&…...

一、简单排序
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、Comparable接口介绍 1.描述 2.Comparable使用 二、冒泡排序 1.排序原理 2.冒泡排序实现 2.1 冒泡排序API 2.2 冒泡排序实现 3.冒泡排序时间复杂度 三…...

慢SQL出现原因、优化、开启慢查询日志
文章目录慢SQL:出现原因:解决方式:开启慢查询日志:慢SQL: 出现原因: (1)数据库表索引设置不合理 (2)SQL语句有问题,需要优化 解决方式: (1&am…...

要理解网络,其实不就是理解这三张表吗
我们如果要理解数据是如果在网络世界中穿梭的,那其实只要了解其中的三张表就可以了。这三张表分别为路由表、转发表、ARP 表。 假设我们用聊天工具聊天的时候,我在北京,你在广东,当我给你发送一条消息的时候。搭载这这条消息的数据…...