selenium执行js代码的两个方法你都会用吗?

这篇具有很好参考价值的文章主要介绍了selenium执行js代码的两个方法你都会用吗?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在使用selenium做web自动化的时候,很多小伙伴反馈有些页面上动作我们无法通过selenium封装的方法直接去做,比如说修改元素的属性,影子节点的操作等等。需要使用原生的js代码去实现,而selenium也给我提供了两个执行js代码的方法,一个是execute_script,另一个是execute_async_script。很多小伙伴不太清楚这两个方法有什么区别。那么今天就来和大家聊聊这两个方法的区别以及使用。

execute_script方法

execute_script这个方法应该是大家用的比较多的,接下来我们来看一下这个方法的源码,源码参考如下:

def execute_script(self, script, *args):
       """
       Synchronously Executes JavaScript in the current window/frame.

       :Args:
        - script: The JavaScript to execute.
        - \*args: Any applicable arguments for your JavaScript.

       :Usage:
           driver.execute_script('return document.title;')
       """
       converted_args = list(args)
       command = None
       if self.w3c:
           command = Command.W3C_EXECUTE_SCRIPT
       else:
           command = Command.EXECUTE_SCRIPT
       return self.execute(command, {
           'script': script,
           'args': converted_args})['value']

通过源码的中的使用案例我们可以看到这个方法使用起来是比较简单的,通过script执行传入js代码即可,那么这个方法还有一个不定长参数args,这个参数可以用来传递一些在执行js代码的时候需要的一些参数,比如通过js去操作某个元素,我们可以将定位到的元素传进去,下面我们通过一个案例来看一下:

案例:12306日期修改

打开12306首页大家可以去试一下,图中的日期输入框是不能够直接通过输入修改日期的,原因是input元素有一个readonly属性(只读属性),要修改日期则需要把readonly这个属性设为false,而selenium中没有直接的方法可以修改元素的属性,只有通过js才能做的,那么接下来我们就使用execute_script方法来执行对应的js代码。

selenium execute_script,selenium,javascript,测试工具,软件测试,接口测试,自动化测试,测试工程师

代码如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Chrome()
driver.implicitly_wait(30)
driver.get('https://www.12306.cn/index/')
# 点击往返
WebDriverWait(driver, 10, 0.5).until(
    EC.element_to_be_clickable(
        (By.XPATH, '//div[@class="search-tab-hd"]//a[text()="往返"]'))).click()

# 定位起始时间和终止时间输入框
start_date = driver.find_element_by_id('go_date')
end_date = driver.find_element_by_id('from_date')
# 准备js代码,通过js输入起始时间和终止时间,
js = """
var s_ele = arguments[0];
var e_ele = arguments[1];
s_ele.readonly = false;
s_ele.value ='2020-05-15';
e_ele.readonly=false;
e_ele.value ='2020-06-15';
return [s_ele.value,e_ele.value]
"""
# js中的arguments[0]接收的是args中的第1个参数,就是下面传入的start_date
# js中的arguments[1]接收的是args中的第2个参数,就是下面传入的end_date
# js代码中可以通过return来返回js代码执行之后的结果
# 执行js代码
res = driver.execute_script(js,start_date,end_date)
driver.quit()

那么关于execute_script这个方法的使用我们就先聊到这里,接下来我们来看看另一个方法,

execute_async_script方法

关于execute_async_script这个方法,我们依然先来看看这个方法的源码,源码参考如下:

def execute_async_script(self, script, *args):
    """
    Asynchronously Executes JavaScript in the current window/frame.

    :Args:
     - script: The JavaScript to execute.
     - \*args: Any applicable arguments for your JavaScript.

    :Usage:
        script = "var callback = arguments[arguments.length - 1]; " \
                 "window.setTimeout(function(){ callback('timeout') }, 3000);"
        driver.execute_async_script(script)
    """
    converted_args = list(args)
    if self.w3c:
        command = Command.W3C_EXECUTE_SCRIPT_ASYNC
    else:
        command = Command.EXECUTE_ASYNC_SCRIPT

    return self.execute(command, {
        'script': script,
        'args': converted_args})['value']

通过源码的注释中我们可以看到,这是一个异步执行js代码的方法,注意:这边的异步执行并不是python中异步执行,而是js代码执行是异步执行的 ,( 关于js异步这边不做过多的扩展,大家可以自行扩展学习),我们来看一下这个方法怎么使用。首先看源码中的使用示例,我们一起来分析一下,

script = """
var callback = arguments[arguments.length - 1]; 
window.setTimeout(function(){ callback('timeout') }, 3000);
"""
driver.execute_async_script(script)

# 首先来看js中第一行代码 var callback = arguments[arguments.length - 1]; 
# 这里是将arguments中的最后一个参数获取出来,那么最后一个参数是什么呢?源码中看不到,这边跟大家解释一下,
# callback接受到的是一个返回数据的函数,当我们通过execute_async_script执行js语句之后,可以通过这个方法来返回内容。
# 然后再来分析一下js中第二行代码,设置了一个一秒钟之后异步执行的函数,函数的内部是执行了callback来返回一个数据。

那么接下来我们还是通过12306这个案例来演示,异步js代码的执行:

案例代码:

"""
============================
Author:柠檬班-木森
Time:2020/5/7   16:25
E-mail:3247119728@qq.com
Company:湖南零檬信息技术有限公司
============================
"""

import time

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Chrome()
driver.implicitly_wait(30)
driver.get('https://www.12306.cn/index/')
# 点击往返
time.sleep(1)
WebDriverWait(driver, 10, 0.5).until(
    EC.element_to_be_clickable((By.XPATH, '//div[@class="search-tab-hd"]//a[text()="往返"]'))).click()

# 定位起始时间和终止时间输入框
start_date = driver.find_element_by_id('go_date')
end_date = driver.find_element_by_id('from_date')
js = """
const callback = arguments[arguments.length - 1]
var s_ele = arguments[0];
var e_ele = arguments[1];
s_ele.readonly = false;
s_ele.value ='2020-05-15';
setTimeout(function() {
    e_ele.value ='2020-06-15';
    callback('修改成功')
}, 3000);
e_ele.readonly=false;
e_ele.value ='2020-07-15';
"""
# 输入起始时间和终止时间
res = driver.execute_async_script(js,start_date,end_date)
print(res)
time.sleep(10)
driver.quit()

# 运行结果:
# print(res) 打印出来的内容为:修改成功
# 页面日期设置的顺序则是:
# 先设置起始日期2020-05-15,
# 开启异步执行的函数(3秒之后执行)
# 再设置终止日期2020-07-15,
# 3秒钟之后
# 设置终止日期2020-06-15
# callback返回: 修改成功

效果图如下:

selenium execute_script,selenium,javascript,测试工具,软件测试,接口测试,自动化测试,测试工程师

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取 【100%免费无套路】 

selenium execute_script,selenium,javascript,测试工具,软件测试,接口测试,自动化测试,测试工程师文章来源地址https://www.toymoban.com/news/detail-860659.html

 全套资料获取方式:点击下方小卡片自行领取即可

到了这里,关于selenium执行js代码的两个方法你都会用吗?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】面试官:你小子,继承与多态的题你都会

    文章目录 前言 一、 理论知识类 二、 编程题选择类 上一篇文章我们详细了介绍了多态,用汇编一步一步的查看了多态的实现原理,讲解了这么多理论知识该做一些面试题了,这些面试题都是历年来大厂所出的笔试题,希望大家可以把我今天所讲的全部学懂~ 1. 下面哪种面向

    2023年04月25日
    浏览(38)
  • 手势交互!人人都会用的交互方式应该如何设计?

    手势交互是指通过手部动作来进行人机交互的一种方式。随着移动设备和触摸屏技术的普及,手势交互成为了一种重要的交互方式。它可以使用户更加直观地操作设备,提升用户体验,同时也可以拓展设备的交互维度,使得用户可以通过更加丰富的手势来完成各种操作。 手势

    2024年01月21日
    浏览(36)
  • 狗都会用的余弦退火(CosineAnnealingLR)学习率调节算法讲解

    今天刚好有空,来讲讲deep learning中学习率调节的常见技巧:余弦退火算法。 学习率是最影响性能的超参数之一,在我们的大多数的炼丹过程中,遇到 loss 变成 NaN 的情况大多数是由于学习率选择不当引起的(当然也有可能是loss实现过程有问题)。 过大的学习率容易造成los

    2024年01月17日
    浏览(48)
  • Git Bash 教程!【不是所有人都会用Git】

    我不太会用github...... 写这篇文章希望能顺利...... 【写在前面】介绍一下git bash的复制粘贴的快捷键,以防后续不会: 开始: 首先下一个windows:git for windows(地址:Git - Downloading Package (git-scm.com)) (上面这个选择框选择第一个,其他的无脑next。安装路径看自己需要更换不) 然

    2024年02月06日
    浏览(37)
  • Python让selenium代码执行完毕不关闭浏览器的方法

    python selenium 在默认情况下,执行完业务逻辑的时候,浏览器也会进行自动关闭,如何让浏览器能够不退呢?下面给出一种我认为比较简单的解决方案供大家进行参考。 用 ChromeOptions options = webdriver.ChromeOptions() 然后 加初始化设置 options.add_experimental_option(‘detach’, True) 然后 将

    2024年02月11日
    浏览(93)
  • 2020最新统计,年薪50万+的Android开发者所必备的知识体系架构,你都会吗?

    JVM JavaIO 注解 序列化 这块知识是现今使用者最多的,我们称之为Android2013~2016年的技术,但是,即使是这样的技术,Android开发者也往往因为网上Copy代码习惯了而导致对这块经常“使用”的代码熟悉而又陌生。 职业生涯规划 面向Android中的一切实体(高级UI+FrameWork源码) 实体

    2023年04月19日
    浏览(80)
  • 用上这个8个AI写作神器,立马告别写作烦恼困扰,你都会了吗? #AI写作#学习

    我们做自媒体运营,想要快速的创作内容,提供文章的创作速度是我们的目标,我们别的大佬可以很快地就创作出一篇内容,而自己墨迹半天确出不了一个字呢?其实这关乎到创作技巧,下面小编就跟大家分享如何利用自媒体工具辅助自己创作的技巧。 1.七燕写作 这是一个微

    2024年04月16日
    浏览(49)
  • elment-ui el-tabs组件 每次点击后 created方法都会执行2次

    先看错误的 日志打印:  错误的代码如下: 正确的日志打印:  正确的代码如下:  前言:     在element-ui的tabs组件中,我们发现每次切换页面,所有的子组件都会重新渲染一次。当子页面需要发送数据请求并且子页面过多时,这样会过多的占用网络资源。这里我们可以使用 v-if

    2024年04月28日
    浏览(41)
  • 【selenium】执行js脚本

    在当前窗口或框架上下文中,执行 JavaScript 脚本。 使用 JavaScript 操作页面: 解决点击不生效的问题 页面滚动 修改元素属性 JavaScript Selenium 调用 定位元素 滑动 常见的滑动场景分为四种: 滑动至底部 滑动至顶部 滑动至具体位置 滑动至目标元素可见 示例:操作控件 获取返回

    2024年02月17日
    浏览(39)
  • 软件测试|selenium执行js脚本

    JavaScript是运行在客户端(浏览器)和服务器端的脚本语言,允许将静态网页转换为交互式网页。可以通过 Python Selenium WebDriver 执行 JavaScript 语句,在Web页面中进行js交互。那么js能做的事,Selenium应该大部分也能做。WebDriver是模拟终端用户的交互,所以就不能点击不可见的元素

    2024年02月05日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包