场景:
F12能找到这个元素,但是selenium报错,元素没有找到
原因:
由于元素在页面中没有显示,无法进行点击操作
解决办法:
用滚动条的方式进行元素可见
from selenium import webdriver
import time
#百度说 chrome document.documentElement.scrollTop不支持,需要用document.body.scrollTop,
但是最新的selenium应该已经支持了,所以无需对drivername进行判断
# 回到顶部
def scroll_top():
js = "var q=document.documentElement.scrollTop=0"
return driver.execute_script(js)
# 拉到底部
def scroll_foot():
js = "var q=document.documentElement.scrollTop=10000"
#这种方式也可以到浏览器底部
#js="window.scrollTo (0, document.body.scrollHeight)"
return driver.execute_script(js)driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://www.baidu.com")
driver.find_element_by_xpath("//*[@id='kw']").send_keys("selenium")
driver.find_element_by_xpath("//*[@id='su']").click()
time.sleep(2)
scroll_foot()
time.sleep(2)
scroll_top()
time.sleep(2)
#通过CSS定位到第10条搜索结果
target = driver.find_element_by_xpath("//*[@id='10']/h3/a")
#利用js将定位到的元素拖动到可见区域
driver.execute_script("arguments[0].scrollIntoView();", target)
#还有一种方式就是直接用js进行点击元素,也可以,但是有风险,可能由于页面没有加载完成而导致元素无法点击
,或者本身元素被隐藏,但是js还是可以点击。慎用!
#driver.execute_script("arguments[0].click();", target)
PS:还有可以指定固定的高度,宽度,这个其实并不是最好的解决方案。
如果能够直接将元素拖动到可见区域是最好的。如果还是不行,我在考虑有其他解决方式。
****************************************************
1、如果滚动条是针对整个HTML可以用如下方式:
js = "var q=document.documentElement.scrollTop=10000" # documentElement表示获取根节点元素
self.driver.execute_script(js)
2、如果滚动条是针对整个body可以用如下方式:
js = "var q=document.body.scrollTop=10000" # documentElement表示获取body节点元素
self.driver.execute_script(js)
3、如果滚动条是针对某个div可以用如下方式:该页面的滚动条就是针对class='main'的div而言的
js = "var q=document.getElementsByClassName('main')[0].scrollTop = 10000"
# getElementsByClassName表示获取class='main'的元素列表,0表示第一个,所以使用的时候要加索引
self.driver.execute_script(js)
|