selenium的包含的方法已能完全满足UI自动化,但是有些时候又不得不用到执行JS的情况,比如在一个富文本框中输入1W个字,使用send_keys方法将经历漫长的输入过程,如果换成使用JS的innerHTML方法就能够很快的完成输入。

selenium执行JavaScript代码的方法有两种:

  1. 执行原生的JS代码
  2. 执行需格式化的JS代码

先简单写个html界面帮助演示

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<textarea id="kw" cols="30" rows="10"></textarea>
<input type="text" name="" id="kw1">
<br><br><br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br><br><br>
<div id="div">div标签</div>
<button onclick="alt()" id="btn">按钮</button>
</body>
<script>
function alt()
{
alert("我出来啦!!!");
};
</script>
</html>

一、执行原生JS代码

这种方法是将所有操作全部交给js代码去实现,包括定位元素以及对元素的操作,因为原生JS定位元素有一定的局限性所以不是所有的元素都能使用该方法。

实现代码如下

from selenium import webdriver
import time # 创建Chrome实例对象
driver = webdriver.Chrome()
# 打开浏览器并访问百度
driver.get("file:///C:/Users/41850/Desktop/test.html")
# 窗口最大化
driver.maximize_window()
time.sleep(2) long_str = "超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超" \
"长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长" \
"内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容" \
"超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长" \
"内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内" \
"容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容" \
"超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超" \
"长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长" \
"内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内" \
"容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容" \
"超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容" # 方法一:执行原生的JS代码
# 例1:向富文本插值
js = f"document.getElementById('kw').innerHTML='{long_str}';"
driver.execute_script(js)
time.sleep(1) # 例2:向input框插值
js = f'document.getElementById("kw1").value="selenium"'
driver.execute_script(js)
time.sleep(1) # 例3:滚动浏览器界面至指定元素
js = f"document.getElementById('div').scrollIntoView()"
driver.execute_script(js)
time.sleep(1) # 例4:点击按钮
js = f'document.getElementById("btn").click()'
driver.execute_script(js) # 关闭浏览器
# driver.quit()

二、先定位元素,再执行JS代码

第二种方法是先使用selenium定位元素,然后使用execute_script方法将传入的参数格式化成JS语句再执行,与第一种方法相比,更易用。

实现代码如下

from selenium import webdriver
import time # 创建Chrome实例对象
driver = webdriver.Chrome()
# 打开浏览器并访问百度
driver.get("file:///C:/Users/41850/Desktop/test.html")
# 窗口最大化
driver.maximize_window()
time.sleep(2) long_str = "超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超" \
"长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长" \
"内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容" \
"超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长" \
"内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内" \
"容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容" \
"超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超" \
"长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长" \
"内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内" \
"容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容" \
"超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容超长内容" # 方法二:执行需格式化的JS代码
# 例1:向富文本插值
el = driver.find_element_by_id("kw")
js = f"arguments[0].innerHTML='{long_str}';"
driver.execute_script(js, el)
time.sleep(1) # 例2:向input框插值
el = driver.find_element_by_id("kw1")
js = f'arguments[0].value="selenium"'
driver.execute_script(js, el)
time.sleep(1) # 例3:滚动浏览器界面至指定元素
el = driver.find_element_by_id("div") js = f"arguments[0].scrollIntoView()"
driver.execute_script(js, el)
time.sleep(1) # 例4:点击按钮
el = driver.find_element_by_id("btn")
js = f'arguments[0].click()'
driver.execute_script(js, el) # 关闭浏览器
# driver.quit()

Selenium_使用execute_script执行JavaScript(11)的更多相关文章

  1. Selenium执行JavaScript脚本

    JavaScript是运行在客户端(浏览器)和服务器端的脚本语言,允许将静态网页转换为交互式网页.可以通过 Python Selenium WebDriver 执行 JavaScript 语句,在We ...

  2. Python爬虫(二十四)_selenium案例:执行javascript脚本

    本章叫介绍如何使用selenium在浏览器中使用js脚本,更多内容请参考:Python学习指南 隐藏百度图片 #-*- coding:utf-8 -*- #本篇将模拟执行javascript语句 fr ...

  3. 爬虫之动态HTML处理(Selenium与PhantomJS )执行 JavaScript 语句

    执行 JavaScript 语句 1.隐藏百度图片 from selenium import webdriverimport time driver = webdriver.PhantomJS()dr ...

  4. 在WebBrowser中执行javascript脚本的几种方法整理(execScript/InvokeScript/NavigateScript) 附完整源码

    [实例简介] 涵盖了几种常用的 webBrowser执行javascript的方法,详见示例截图以及代码 [实例截图] [核心代码] execScript方式: 1 2 3 4 5 6 7 8 9 1 ...

  5. python 查找元素 获取元素信息 元素交互操作 执行JavaScript

    from selenium import webdriver browser = webdriver.Firefox() browser.get("https://tieba.baidu.c ...

  6. Python_selenium之执行JavaScript

    Python_selenium之执行JavaScript 一.简略的介绍selenium执行JavaScript 1. Example 1进入浏览器之后,弹出一个alert弹框 #coding:utf ...

  7. 配置 Sublime Text 用 Node.js 执行 JavaScript 程序

    1. 首先到 nodejs.org 下载 Node.js 安装包并安装. 2. 打开 Sublime Text 2 编辑器.选择菜单 Tools --> Build System --> ...

  8. python中执行javascript代码

    python中执行javascript代码: 1.安装相应的库,我使用的是PyV8 2.import PyV8 ctxt = PyV8.JSContext()     ctxt.enter()     ...

  9. C#执行javascript代码

    最近在做网站自动登陆小工具,遇到技术屏障.密码在submit时会使用js进行加密.这时我需要模拟这个加密过程,想到使用C#执行javascript代码. 对于执行javascript代码,纯代码方式使 ...

随机推荐

  1. 【Linux】【Services】【Disks】zfs

    1. 简介: 据说zfs有去除重复数据的功能,无良人士继续要求吧samba共享盘使用的centos7上自带的xfs改成zfs,并且开启去重功能.samba配置见 http://www.cnblogs. ...

  2. Log4j 被曝核弹级漏洞,开发者炸锅了!

    大家好,我是鱼皮,开门见山,知名的开源项目 Apache Log4j 出事了! 2021 年 12 月 9 日,该项目被曝存在 严重安全漏洞 ,攻击者只需要向目标机传入一段特殊代码,就能触发漏洞,自由 ...

  3. Table.RowCount行列计数…Count(Power Query 之 M 语言)

    数据源: 任意五行两列 目标: 计算行数(包括空行) 操作过程: [转换]>[对行进行计数] M公式:  = Table.RowCount( 表 ) 扩展: 对表中列进行计数:= Table.C ...

  4. Table.PromoteHeaders升降标题Table…Headers(Power Query 之 M 语言)

    数据源: 任意数据源 目标: 将第一行提升为标题 操作过程: [主页](或[转换])>[将第一行用作标题] M公式: = Table.PromoteHeaders( 表, [PromoteAll ...

  5. python 快速启动http监听服务

    python3 [root@vm10-20-9-45 ~]# python3 -m http.server 2378 Serving HTTP on 0.0.0.0 port 2378 (http:/ ...

  6. table中tr、td标签设置只读,不能修改(readonly属性)

    在不能修改的位置加上代码:onselectstart="return false" οnselect="document.selection.empty()" ...

  7. c++设计模式概述之模板方法

    代码写的不够规范,目的是为了缩短文章篇幅,实际中请不要这样做. 1.概述 如其名,模板,也就是说,有一个已经做好的模板把框架做好了,剩下的,只需要我们将内容填充到模板下. 例如修房屋,框架结构搭建完成 ...

  8. 【LeetCode】56. Merge Intervals 解题报告(Python & C++ & Java)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  9. 【LeetCode】853. Car Fleet 解题报告(Python)

    [LeetCode]853. Car Fleet 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxu ...

  10. B. Destroying Roads

    Destroying Roads 题目链接 题意 n个点,m条边每两个点之间不会有两个相同的边,然后给你两个起s1,s2和终点t1,t2; 求删除最多的边后满足两个s1到t1距离\(<=l1\) ...