场景: 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)