selenium并不是万能的,页面上有些操作无法实现时,就需要借助JS代码来完成了。selenium提供了一个方法:execute_script(),可以执行JS脚本代码。
比如:当页面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接定位到的,会报元素不可见的错误。这时候需要借助滚动条来拖动屏幕,使被操作的元素显示在当前的屏幕上。而滚动条是无法直接用定位工具来进行定位的,selenium也没有提供直接的方法去控制滚动条,这时候只能借助JS代码来完成。
一、JavaScript简介
为什么要了解JavaScript?因为有些特殊的操作是selenium+python无法直接完成的,而JavaScript刚好是这方面的强项,所以算是一个很好的补充。
JavaScript是一种运行在浏览器中的解释型编程语言:http://www.w3school.com.cn/js/index.asp4。
二、纵向滚动条
1)滚动条回到顶部
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('https://xa.ganji.com/')
time.sleep(1)
# 滚动条回到顶部
js = "window.scrollTo(0, 0)"
driver.execute_script(js)
2)滚动条拉到底部
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('https://xa.ganji.com/')
time.sleep(1)
# 滚动条拉到底部
js = "window.scrollTo(0, document.body.scrollHeight)"
driver.execute_script(js)
--scrollHeight:获取对象的滚动高度。
--scrollWidth:获取对象的滚动宽度。
三、横向滚动条
有时候浏览器页面需要左右滚动(一般屏幕最大化后,左右滚动的情况就很少见了)。通过scrollTo(x, y)方法可以控制横向和纵向滚动条,其中第一个参数x是横向距离,第二个参数y是纵向距离。
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('https://xa.ganji.com/')
time.sleep(1)
js = "window.scrollTo(100, 400);"
driver.execute_script(js)
四、元素聚焦
用上面的方法可以解决拖动滚动条的位置问题,但是有时候无法确定我需要操作的元素在什么位置,有可能每次打开的页面不一样,元素所在的位置也不一样,怎么办呢?
这个时候我们可以先让页面直接跳到元素出现的位置,然后就可以进行操作了,同样需要借助JS代码来实现。
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('https://xa.ganji.com/')
time.sleep(1)
# 元素聚焦
target = driver.find_element('xpath', '//*[@id="app"]/div/div[2]/div[3]/div[1]')
driver.execute_script("arguments[0].scrollIntoView();", target)