【selenium】css的方法,定位href=“javascript:;” 的元素

selenium用css的方法,定位href=“javascript:;”


案例:www.baidu.com中的设置元素

<a id="s_usersetting_top" href="javascript:;" name="tj_settingicon" class="pf s-user-setting-top">
    <span class="setting-text">设置</span>
</a>

通常我们看到id后,就可以用css的方法来定位了

find_element(By.CSS_SELECTOR,"#s_usersetting_top>span:nth-child(1)")

但是定位后发现不行,然后去chrome的console中查看是不是自己写错了,发现也没有错呀,为什么?

$('#s_usersetting_top>span:nth-child(1)')
init [span.setting-text, prevObject: init(1), context: document, selector: "#s_usersetting_top>span:nth-child(1)"]0: span.setting-textlength: 1prevObject: init [document, context: document]context: documentselector: "#s_usersetting_top>span:nth-child(1)"__proto__: Object(0)
分析
  • 发现为什么id那里的的href是"javascript:;"

  • 可能chrome自动帮我们解析了js,但是selenium中并没有帮我们解析

  • 可以通过print(“driver.page_source”)打印出来

  • 通过driver.page_source打印出来的结果,我们截取要的设置的内容

<div id="u">
<a class="toindex" href="/">百度首页</a>
<a href="javascript:;" name="tj_settingicon" class="pf">设置<i class="c-icon c-icon-triangle-down"></i></a>
<a href="https://passport.baidu.com/v2/?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2F&amp;sms=5" name="tj_login" class="lb" onclick="return false;">登录</a>
</div>
<div id="u1">
<a href="https://voice.baidu.com/act/newpneumonia/newpneumonia/?from=osari_pc_1" target="_blank" id="virus-2020" class="mnav sp dot">抗击肺炎</a>
<a href="http://news.baidu.com" name="tj_trnews" class="mnav">新闻</a><a href="https://www.hao123.com" name="tj_trhao123" class="mnav">hao123</a>
<a href="http://map.baidu.com" name="tj_trmap" class="mnav">地图</a><a href="http://v.baidu.com" name="tj_trvideo" class="mnav">视频</a>
<a href="http://tieba.baidu.com" name="tj_trtieba" class="mnav">贴吧</a><a href="http://xueshu.baidu.com" name="tj_trxueshu" class="mnav">学术</a>
<a href="https://passport.baidu.com/v2/?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2F&amp;sms=5" name="tj_login" class="lb" onclick="return false;">登录</a>
<a href="http://www.baidu.com/gaoji/preferences.html" name="tj_settingicon" class="pf">设置</a>
<a href="http://www.baidu.com/more/" name="tj_briicon" class="bri" style="display: block;">更多产品</a>
</div>
  • 发现这里有两个设置,第一个设置有href=“javascript:;”,所以肯定不能用
  • 最后一个设置,我们看到一个唯一值href=“搜索设置”,所以肯定用这个
  • 为什么不用name,因为name="tj_settingicon"有两个,当然不能用

最后具体实现的代码如下,加上鼠标移动元素判断你到底是不是定位到百度的设置

from selenium import webdriver
from time import sleep
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By

driver=webdriver.Chrome()
driver.maximize_window()
driver.get("https://www.baidu.com")
settings=driver.find_element(By.CSS_SELECTOR, 'a[href="http://www.baidu.com/gaoji/preferences.html"]')
action=ActionChains(driver)
action.move_to_element(settings)
action.perform()
sleep(5)