当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     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(js7)
driver.execute_script("momo();")

你可能感兴趣的:(selenium)