当前位置: 首页 > news >正文

JavaScript操作

做UI自动化的时候,有些操作无法直接通过selenium自带方法操 作成功,那么就需要借助前端js操作实现。

  • 比如浏览器的滚动条这种不是html页面的内容,无法直接通过selenium 控制到。需要借助JavaScript控制。
  • 比如有些点击操作无法通过普通点击+鼠标点击成功,也需要通过js控制 完成。
  • 比如有些元素的属性是不可以输入内容的,但是可以通过js修改元素的属 性,从而实现对他的一些操作。

所以通过在Selenium WebDriver中执行JavaScript可以大大增强Selenium 的能力,Selenium对于一些特殊场景的元素操作无能为力,我们可以借助 JavaScript来处理。

  • 优先使用selenium操作实现 如果不行 借助js操作。

web页面的三大组成部分:

  • html 代表页面内容
  • css 代表样式布局
  • javascript DOM 对于html的内容可以行增删改查,控制页面内容显示/数据 展示/动画效果的
    • 比如页面登录按钮点击可以登录成功,这个也是js代码前端控制的。
    • 在所有的浏览器里都内置了js的解释器,用来运行和编写 和调试 js代 码。

JavaScript语法和使用:

js语言学习为网站:https://www.runoob.com/js/js-functions.html,可以了解 一下,但是我们用的都是比较简单的一些语法。

document指的页面文档内容;document.后面提供了很多方法,可以操作页 面内容:

  • document.getElementById("kw") :元素定位
  • document.documentElement.scrollTop=100 : 控制滚动条滚动页面

在Python代码中调用JavaScript 【js滚动条操作】

使用方式1-不传参:driver.execute_script("...") ,直接在UI脚本里执行js代码

  • driver.execute_script("document.documentElement.scrollTop=3005")
  • 问题: js定位元素的方式有限,不如python代码灵活 - 不支持xpath;所以 直接执行的当时用的比较少

使用方式2-传参:driver.execute_script("arguments[0]...",element) ==用的更多 重点掌握

  • element是 通过Selenium元素定位找到对应的元素:
    • element = driver.find_element(By.ID,"XX")
    • 可以通过八大元素定位方法定位到元素 更加灵活
  • arguments[0]代表就是传递进来js脚本的第一个参数,也就是element这 个值
    • driver.execute_script("arguments[0]...",element)
  • js脚本里可以传多个参数,arguments[1]代表的就是传递进来的第二个参 数,依次类推
    • driver.execute_script('arguments[0][arguments[1]].click()', elements, 1)
      """
      点击操作:
      1、普通点击
      2、鼠标点击
      3、js点击
      """
      from selenium import  webdriver
      from time import sleep
      from selenium.webdriver.common.action_chains import ActionChainsfrom selenium.webdriver.common.by import Bydriver = webdriver.Chrome()# 点击元素--课堂派
      driver.get("https://www.ketangpai.com/#/login")
      driver.find_element(By.XPATH,'//input[@placeholder="请输入邮箱/手机号/账号"]').send_keys("2378807189@qq.com")
      driver.find_element(By.XPATH,'//input[@placeholder="请输入密码"]').send_keys("12345678")
      # 登录按钮元素
      ele_login = driver.find_element(By.XPATH,'//span[text()="登录"]')# 1、普通点击操作 --不成功 报错
      # ele_login.click()
      # 2、鼠标点击 : 虽然没有报错 但是没有点击
      # ActionChains(driver).click(ele_login).perform()
      # 3、js点击 --js传参方式  成功点击了
      # driver.execute_script("arguments[0].click()",ele_login)# 演示一下js里传多个参数写法
      driver.execute_script("arguments[0].click();alert(arguments[1])",ele_login,"登录失败")sleep(5)
      driver.quit()

js点击操作

 点击元素:有些网站就是无法直接点击 和鼠标点击,但是可以通过js点击成 功。【比如课堂派登录按钮】

  • 直接点击元素+鼠标点击都不成功 通过js
  • 点击元素的代码:arguments[0].click()

总结一下点击的方法:

  • 1、click()
  • 2、鼠标 ActionChains(driver).click(目标元素).perform()
  • 3、通过JavaScript来进行点击
    """
    使用方式1-不传参:driver.execute_script("...") ,直接在UI脚本里执行js代码
    * driver.execute_script("document.documentElement.scrollTop=3005")
    * 问题: js定位元素的方式有限,不如python代码灵活 - 不支持xpath;所以直接执行的当时用的比较少
    """
    from selenium import  webdriver
    from time import sleepdriver = webdriver.Chrome()# 场景一: 滚动条
    driver.get("http://testingpai.com/")sleep(2)
    # 在Python代码里执行js脚本操作
    driver.execute_script("document.documentElement.scrollTop=1000")sleep(2)
    driver.quit()# # 场景二:点击元素
    # driver.get("https://www.baidu.com/")
    #
    # sleep(2)
    # # 执行js点击操作
    # driver.execute_script('document.getElementById("su").click()')
    #
    # sleep(2)
    # driver.quit()
    

js修改属性并操作 -- 用的不多,了解

有些页面的数据是默认不让输入的,比如【电商项目的收货地址】的日期输入 框不能直接输入的,那么自动化测试的时候需要输入,就需要借助js代码进行操 作。

js代码检查页面的只读属性:

  • js删除某个属性:
    • arguments[0].removeAttribute('readonly')
    • 删除 记得强制等待一下
      # 1、修改元素的属性/移除元素的属性 - 了解
      # document.getElementByXXX(XXX).setAttribute("name","lemon")
      # document.getElementByXXX(XXX).RemoveAttribute("name")
      
"""
# 1、修改元素的属性/移除元素的属性 - 了解
# document.getElementByXXX(XXX).setAttribute("name","lemon")
# document.getElementByXXX(XXX).RemoveAttribute("name")
"""
from selenium import  webdriver
from selenium.webdriver.common.by import By
from time import sleep
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait# 封装的意思:把相同类似的代码放到一个函数里面,重复使用
def wait_element_clickable(locator):web_element = WebDriverWait(driver,8,0.5).until(EC.element_to_be_clickable(locator))return web_elementdef wait_element_visible(locator):#web_element代表通过显示等待找到的元素web_element =  WebDriverWait(driver, 8, 0.5).until(EC.visibility_of_element_located(locator))return web_elementdef wait_element_presence(locator):#web_element代表通过显示等待找到的元素web_element =  WebDriverWait(driver, 8, 0.5).until(EC.presence_of_element_located(locator))return web_elementdriver = webdriver.Chrome()
driver.get('http://mall.lemonban.com:3344/')
driver.maximize_window()
wait_element_clickable((By.LINK_TEXT,'登录')).click()
wait_element_visible((By.XPATH,'//input[@placeholder="请输入手机号/用户名"]')).send_keys('lemon_py')
wait_element_visible((By.XPATH,'//input[@placeholder="请输入密码"]')).send_keys('12345678')
wait_element_clickable((By.CLASS_NAME,'login-button')).click()
sleep(2)  # 一定要等待2s
wait_element_clickable((By.XPATH,'//span[text()="个人中心"]')).click()
wait_element_clickable((By.LINK_TEXT,'收货地址')).click()
wait_element_clickable((By.LINK_TEXT,'新增收货地址')).click()
sleep(2)# js修改属性操作
ele = driver.find_element(By.XPATH,'//div[@prop="province"]//input')
# 删除readonly属性
# driver.execute_script("arguments[0].removeAttribute('readonly')",ele)
driver.execute_script("arguments[0].setAttribute('placeholder','123')",ele)
sleep(1)
# ele.send_keys("黄花机场")sleep(4)
# driver.quit()

JavaScript总结使用

1、页面的滚动/内嵌滚动条滚动

  • document.documentElement.scrollTop = 200
  • 先要去找到内嵌滚动条元素,再去进行滚动【scrollTop】

2、点击:click()

3、修改元素的属性(删掉/改变元素的属性)

  • removeAttribute()
  • setAttribute()

相关文章:

JavaScript操作

做UI自动化的时候,有些操作无法直接通过selenium自带方法操 作成功,那么就需要借助前端js操作实现。 比如浏览器的滚动条这种不是html页面的内容,无法直接通过selenium 控制到。需要借助JavaScript控制。比如有些点击操作无法通过普通点击鼠…...

雪花算法 代码

/*** author lwh* date 2023/9/5* description 批量插入,手动设置**/ public class IdWorker {//因为二进制里第一个 bit 为如果是 1,那么都是负数,但是我们生成的 id 都是正数,所以第一个 bit 统一都是 0。//机器ID 2进制5位 3…...

我把PostgreSQL最核心的插件撸干净了!!!

作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验, Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主,全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复, 安装迁移,性能优化、故障…...

Transformer详解(1)-结构解读

Transormer块主要由四个部分组成,注意力层、位置感知前馈神经网络、残差连接和层归一化。 1、注意力层(Multi-Head Attention) 使用多头注意力机制整合上下文语义,它使得序列中任意两个单词之间的依赖关系可以直接被建模而不基于传统的循环结构&#…...

使用Flask Swagger自动生成API文档

文章目录 安装Flask Swagger使用Flask Swagger生成API文档总结1. 自动化文档生成2. 交互式文档展示3. 规范化API设计4. 提升协作效率5. 支持多种格式 Flask Swagger是一种用于管理Flask API文档的工具。它基于OpenAPI规范,可以自动生成API的交互式文档。使用Flask S…...

操作系统408考研-经典例题

什么是操作系统?答:操作系统,是计算机系统中最基本、最重要的系统软件,是其它软件 的***支撑***。控制和管理计算机系统的硬件和软件资源,合理的组织计算机工 作流程,并为用户使用计算机提供公共和基本的服务 2.多道程序 (multiprogrammming) 和多重处理 (multiprocessi…...

工程项目管理系统源码与Spring Cloud:实现高效系统管理与二次开发

随着企业规模的不断扩大和业务的快速发展,传统的工程项目管理方式已经无法满足现代企业的需求。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性,企业需要借助先进的数字化技术进行转型。本文将介绍一款采用Spring CloudSpring BootMybat…...

react中hook 函数的使用

以 use 开头的函数被称为 Hook。useState 是 React 提供的一个内置 Hook。你可以在 React API 参考 中找到其他内置的 Hook。你也可以通过组合现有的 Hook 来编写属于你自己的 Hook。 Hook 比普通函数更为严格。你只能在你的组件(或其他 Hook)的 顶层 调…...

探索k8s集群中kubectl的陈述式资源管理

一、k8s集群资源管理方式分类 1.1陈述式资源管理方式:增删查比较方便,但是改非常不方便 使用一条kubectl命令和参数选项来实现资源对象管理操作 即通过命令的方式来实 1.2声明式资源管理方式:yaml文件管理 使用yaml配置文件或者json配置文…...

webgl入门-绘制三角形

绘制三角形 前言 三角形是一个最简单、最稳定的面,webgl 中的三维模型都是由三角面组成的。咱们这一篇就说一下三角形的绘制方法。 课堂目标 理解多点绘图原理。可以绘制三角形,并将其组合成多边形。 知识点 缓冲区对象点、线、面图形 第一章 web…...

深入分析 Android Activity (三)

深入分析 Android Activity (三) 1. Activity 的配置变化处理 当设备配置(如屏幕方向、语言、屏幕大小等)发生变化时,默认情况下,Android 会销毁并重新创建当前的 Activity。这种行为确保了新配置能够正确应用,但在某…...

电影《朝云暮雨》观后感

上周看了电影《朝云暮雨》,看完之后,感觉自己整个人都不太好了,也不是说电影太差,只是觉得电影没有传达正能量,让人很不舒服。 (1)演技在线 对于著名的演员“范伟”,或者说&#x…...

Isaac Sim仿真平台学习(1)认识Isaac Sim

0.前言 上一个教程中我们下载好了Isaac Sim,这一章我们将来简单了解一下Isaac Sim平台。 isaac Sim仿真平台安装-CSDN博客 1.Isaac Sim是啥? What Is Isaac Sim? — Omniverse IsaacSim latest documentation Isaac Sim是NVDIA Omniverse平台的机器…...

C++:vector基础讲解

hello,各位小伙伴,本篇文章跟大家一起学习《C:vector基础讲解》,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 ! 如果本篇文章对你有帮助,还请各位点点赞!&#…...

Grafana 路径遍历所有路径 CVE-2021-43798漏洞预警

简介​ ​Grafana是一个跨平台、开源的数据可视化网络应用程序平台。用户配置连接的数据源之后,Grafana可以在网络浏览器里显示数据图表和警告。 漏洞危害等级 高危 CVE 编号​ CVE-2021-43798 FOFA查询 ​app"Grafana" ​zoomeyes查询 ​app:"gr…...

基于Docker部署GitLab环境搭建

文件在D:\E\学习文档子目录压缩\专项进阶,如ngnix,webservice,linux,redis等\docker 建议虚拟机内存2G以上 1.下载镜像文件 docker pull beginor/gitlab-ce:11.0.1-ce.0 注意:一定要配置阿里云的加速镜像 创建GitLab 的配置 (etc) 、 日志 (log) 、数…...

初始化是什么

定义 初始化(Initialization)是指在计算机科学和软件开发中,将系统、变量、对象或其他可用组件设置为其初始状态或初始值的过程。这通常是在程序开始执行或组件第一次使用之前进行的,以确保其处于可预测和稳定的状态。 初始化的…...

Python图形界面(GUI)Tkinter笔记(九):用【Button()】功能按钮实现人机交互

在Tkinter库中,功能按钮(Button)是实现人机交互的一个非常重要的组件: 【一】主要可实现功能及意义: (1)响应用户交互: Button组件允许用户通过点击来触发某个事件或动作。当用户点击按钮时,可以执行一个指定的函数或方法。 (2)提供用户输入: Button组件是图形用户界面(G…...

linux 内核安装、切换版本,禁用内核更新

安装内核 版本5.15.0-105 sudo apt-get install linux-image-5.15.0-105-generic sudo apt-get install linux-headers-5.15.0-105-generic切换内核版本 #查看已安装内核版本 grep menuentry /boot/grub/grub.cfg sudo dpkg --get-selections |grep linux-image#修改文件/etc…...

充电桩中PE接地实时监测的一种电路.pdf

pdf下载链接:https://pan.baidu.com/s/18k8tEwa6h3WAOGJs3lAsTQ 提取码:Ronv...

Spring Boot面试题精选汇总

🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

今日科技热点速览

🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)

第一篇&#xff1a;Liunx环境下搭建PaddlePaddle 3.0基础环境&#xff08;Liunx Centos8.5安装Python3.10pip3.10&#xff09; 一&#xff1a;前言二&#xff1a;安装编译依赖二&#xff1a;安装Python3.10三&#xff1a;安装PIP3.10四&#xff1a;安装Paddlepaddle基础框架4.1…...