当selenium 定位页面元素失效时尝试使用execute_script执行js函数定位

案例以百度为例:

from selenium import webdriver
import time


path='./chromedriver.exe'

driver = webdriver.Chrome(executable_path=path)

url = 'https://www.baidu.com'


driver.get(url)

#js1执行操作是清除输入框的内容
js1="""
$("span > input#kw").val('');
"""
driver.execute_script(js1)

#js2为输入框赋值内容,无法为密码输入框赋值
js2="""
$("form>span > input#kw").val('python');
"""
driver.execute_script(js2)

#js3执行点击操作

js3="""
document.querySelector("form#form>span.bg.s_btn_wr>input#su").click()
"""
driver.execute_script(js3)

time.sleep(6)

#js4当有多个标签并列,并且想根据标签的text值进行定位时,可以先获取标签列表再进行判断,'文库'是传的参数

js4="""
var params = arguments[0];
var links=document.querySelectorAll("div#s_tab>div>a");
var lens=links.length;
for(var i=0;i<lens;i++){
    console.log(links[i].text);
    if(links[i].text==params){
        console.log(links[i].text);
        links[i].click();
        break;
    }
}"""

driver.execute_script(js4,'文库')

#js5点击  a:nth-child(7)表示a标签的第七个兄弟节点

js5="""
document.querySelector("div#s_tab>div>a:nth-child(7)").click();
"""
driver.execute_script(js5)

time.sleep(5)

#js6和js7功能相同,先创建一个script标签,然后为script标签赋值js内容,js函数内容需要写在一行或者用\在每行结尾隔开;实现js注入;js7是一个匿名函数,selenium默认会为js命令外面加上()变成匿名函数,所以js6和js7功能是一样的

js6="""
s = document.createElement('script');
s.textContent = 'function momo(){\
alert("lalala");\
console.log("lalala")};';
document.body.appendChild(s);
"""
js7="""
(function(){
    s = document.createElement('script');
    s.textContent = 'function momo(){alert("lalala");};';
    document.body.appendChild(s);
})();
"""
driver.execute_script(js6)
driver.execute_script(js7)

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值