前戏
在进行web自动化的时候,selenium只能找当前屏幕上的标签,如果标签在当前页面没显示下,需要拖动滚动条才能查看到这个元素,这时候就要操作浏览器的滚动条,让当前页面显示这个元素才可以操作,在我之前做web自动化的时候,也找了很多的操作浏览器的方法,有些由于浏览器或者版本的问题已经使用不了了,所以下面的方法大家自己去尝试。
设置滚动条距离顶部的位置
from selenium import webdriver driver = webdriver.Chrome() driver.get('xxx') js = 'var action=document.documentElement.scrollTop=10000' # 设置滚动条距离顶部的位置,设置为 10000, 超过10000就是最底部 driver.execute_script(js) # 执行脚本 js = 'var action=document.documentElement.scrollTop=0' # 回到顶部
driver.execute_script(js)
driver.quit()
使用js的scrollTo函数
from selenium import webdriver import unittest, time class TestDemo(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome() def test_scroll(self): url = 'http://www.seleniumhq.org/' try: self.driver.get(url) # 使用js的scrollTo函数和document.body.scrollHeight参数 # 将页面的滚动条滑动到页面的最下方 self.driver.execute_script('window.scrollTo(1000,document.body.scrollHeight);') # 使用js的scrollIntoView函数将遮挡的元素滚动到可见屏幕上 # scrollIntoView(true)表示将元素滚动到屏幕中间 # scrollIntoView(false)表示将元素滚动到屏幕底部 self.driver.execute_script("document.getElementById('choice').scrollIntoView(true);") self.driver.execute_script("document.getElementById('choice').scrollIntoView(false);") time.sleep(3) # 使用js的scrollBy方法,使用0和400横纵坐标参数, # 将屏幕向下滚动400像素 self.driver.execute_script('window.scrrollBy(0,400);') time.sleep(3) except Exception as e: print(e) def tearDown(self): self.driver.quit() if __name__ == '__main__': unittest.main()
横向滚动条
在web自动化中,不只只有纵向滚动条,可能还有横线滚动条
js ="window.scrollTo(100,400);" driver.execute_script(js) # 第一个参数 x 是横向距离,第二个参数 y 是纵向距离
以上方法在 Firefox 上是可以的,但是用 Chrome 浏览器,发现不管用。谷歌浏览器就是这么任性,不听话,于是用以下方法解决谷歌浏览器滚动条的问题。
js = "var q=document.body.scrollTop=0" driver.execute_script(js)
元素聚焦
虽然用上面的方法可以解决拖动滚动条的位置问题,但是有时候无法确定我需要操作的元素,这个时候我们可以先让页面直接跳到元素出现的位置,然后就可以操作了。同样需要借助 JS 去实现
target = driver.find_element_by_xxxx() driver.execute_script("arguments[0].scrollIntoView();", target)