Python selenium中添加JS并执行JS语句

  众所周知,Python通常结合selenium模块来完成一些web的自动化测试以及RPA(Robotic Process Automation)工作。事实上,Selenium还可以支持插入js语句、执行js语句、返回js语句的执行结果到python程序中。这对于那些已经习惯了Javascript语法的程序员们,简直是一大神器。

  举个简单的例子,我们用selenium原生的方法对页面的一个input元素执行输入时,通常需要用到selenium中的send_keys以及clear方法,

代码类似于:

driver.find_element_by_xpath(‘//*[@id="dataList"]//input‘).clear()
driver.find_element_by_xpath(‘//*[@id="dataList"]//input‘).send_keys("Your contents")

  该方法大多数时候已经足够好用,但是仔细分析,send_keys方法主要是模拟的用户键盘操作,程序执行时必须要保证该元素始终获取焦点,页面执行过程中尽量不能动页面,否则send_keys方法可能会失效。而且我们每次send_keys之前需要对input元素已有的text进行清空,即初始化。笔者推荐使用JS注入selenium的方法来达到更好的效果,在selenium中写JS语句往往是如下形式:

js="document.getElementsByClassName(‘form-control‘)[0].value=‘%s‘;"%(requestCode[i][0].value)
driver.execute_script(js)

  该方法,相当于是直接调用页面元素的value方法来进行赋值,不用考虑变量初始化问题,它属于网页后台功能,类似于F12直接在console中执行代码,不需要光标停留在该input元素上。

使用JS后,我们就可以使用诸如document.getElementsByClassName、QuerySelector、QuerySelectorAll等JS方法定位元素,玩儿法大大丰富;

近日,笔者在一个具体的项目中,需要提取页面某表格的某一列值,该表格虽然最多支持100行来分页,但是用户可视区域只能显示15行。笔者需要提取该列的每一个值做后续判断。开始的方法是用的原生的selenium写法:

elements=driver.find_elements_by_xpath("//tr[contains(@id,‘datagrid-row-r1-1‘)]")
for element1 in elements:
    textList1=element1.text
    value2=re.search(r"(H\d{13})",textList1)
    slaStatus=re.search(r"(aa|bb|cc)",textList1)
    statusList.append(slaStatus.group(1))
    value2List.append(value2.group(1))    

奇怪的事情发生了,该elements对象是一个列表,尽管它超过15个元素,但是每次遍历过程中,始终只能读取到前15个元素的text属性,之后的element元素,其text始终为空。笔者过程中换用了正则表达式、cssSelector、xpath等多种方法来提取该属性,总是只能提取到前15个元素的text属性。但是笔者将鼠标悬停在elements中,可以看到VSCode已经捕获到了所有对应元素的text,百思不得其解:

最后,笔者使用JS注入的方法完美避开了此问题,达到同样效果。

js=r"""

var ss="";

for(var i= 1; i< document.querySelectorAll(‘[field="x"]‘).length; i ++)

{

ss=ss+document.querySelectorAll(‘[field="x"]‘)[i].innerText;

ss=ss.replace(/[\r\n]/g,"")+"|";

};

return ss;

"""

value2

=driver.execute_script(js)

value2List=value2.split("|")

  该方法中,笔者使用document.querySelectorAll方法获取到field属性="x"的所有元素的合集,遍历过程中,取其innerText并最终借助“|”拼接成字符串。最后在python环境下通过字符串的split方法基于“|”拆分成列表,相当于编码再解码。笔者之所以这样操作是因为,如果js语句执行结果返回的是一个数组,该数组如何与python中的列表直接对接?

无论如何,使用JS的方法完美地提取到了页面元素的属性,达到同样的效果。程序员尤其是新手,在编程过程中难免遇到这样那样的问题。但是一旦你掌握了足够多的方法,就总能在不断尝试过程中接近想要的答案!

原文地址:https://www.cnblogs.com/new-june/p/9665364.html

时间: 2024-08-27 00:36:53

Python selenium中添加JS并执行JS语句的相关文章

python列表中添加对象时的注意

最近在用python写代码,用到了对象数组.在c++中我们要使用能够灵活操作的对象数组,一般会用stl的vector类,该类的push_back方法可以将一个对象的拷贝加入到vector对象中,所以当使用[]下标对vector的元素进行修改时,原来的作为push_back参数的那个对象的值并不会改变.python中类似的方法是列表的append方法,但是要注意此时若加入到列表中的是基础数据类型,则是值传递,若是对象,则是引用传递.这种参数的传递方式和java一样.因此,在python中通过列表下

JS href执行JS事件

参考地址 https://blog.csdn.net/zhangshuang92/article/details/54407229/ href执行JS https://blog.csdn.net/bingguang1993/article/details/82747448 异常报错 JS代码如下: <a href = "javascript:js_method()">文本</a> //不推荐,但是实在是好用,具体原因在参考地址查看 <a href =&qu

python selenium中iframe切换、window切换方法

一.selenium中iframe切换方法: 方法一:switch_to.frame frame函数中提供了三种定位方法: driver.switch_to.frame('frame_name') driver.switch_to.frame(1) driver.switch_to.frame(driver.find_elements_by_tag_name("iframe")[0]) 以腾讯课堂为例: from selenium import webdriver from time

在数据表中添加一个字段的SQL语句怎么写

如果要在数据表中添加一个字段,应该如何表示呢?下面就为您介绍表添加字段的SQL语句的写法,希望可以让您对SQL语句有更深的认识. 通用式: alter table [表名] add [字段名] 字段属性 default 缺省值 default 是可选参数 增加字段: alter table [表名] add 字段名 smallint default 0 增加数字字段,整型,缺省值为0 alter table [表名] add 字段名 int default 0 增加数字字段,长整型,缺省值为0

python selenium中调用js

python 中js中单引号和双引号混合编程 js = 'document.getElementsByName("m:ybzbxmbd:b_BIANHAO")[0].setAttribute("bianhao","{\'autoInc\':true,\'bianhaoID\':\'1483490727692\',\'prefix\':\'ZF(2017)-JG-宣传用品-\',\'postfix\':\'\',\'fulltxt\':\'ZF(2017)-

selenium测试(Java)--执行JS(十八)

1.  操作滚动条 package com.test.js; import org.openqa.selenium.By; import org.openqa.selenium.Dimension; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; public class Wi

Node.js在执行js文件时总是出错 SyntaxError: Unexpected identifier

直接把hello.js文件拖进去试试 追问 直接将hello.js文件拖进node.js的窗口后,会在窗口中显示出hello.js文件的路径,回车以后什么都没有发生. 追答 直接打开cmd名利提示符面板输入node.exe 敲个空格,记得别按回车键,然后吧hello.js文件拖上去,然后在回去执行就ok了

python selenium 中的显示等待WebDriverWait与条件判断expected_conditions

#coding=utf-8 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 base_url = "http://www.baidu.com"

python selenium中如何测试360等基于chrome内核的浏览器

转自:https://blog.csdn.net/five3/article/details/50013159 直接上代码,注意是基于chrome内核的浏览器,基于ie的请替换其中的chrome方法为ie,但自己未尝试过,如果有结果可以告知! from selenium.webdriver.chrome.options import Optionsfrom selenium import webdriverfrom selenium.webdriver.common.keys import Ke