执行js脚本来控制浏览器竖向滚动条:
打开百度贴吧,然后拖动滚动条到左侧 “地区"
# coding=utf-8
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(6)
driver.get("https://tieba.baidu.com/index.html")
time.sleep(1)
target_elem = driver.find_element_by_link_text("地区")
driver.execute_script("return arguments[0].scrollIntoView();",target_elem) # 用目标元素参考去拖动
#driver.execute_script("scroll(0,2400)") # 这个是第二种方法,比较粗劣,大概的拖动
本人在添加cbs满减活动的时候用到:
思路就是:首先能获取当前弹框中产品的总数量,然后每获取一个产品就以目标元素为参考去拖动滚动条,这样既能全部获取也能按照产品顺序装进列表中:
# 选择iframe
driver.switch_to.frame(0)
time.sleep(2)
cbs_all_product = []
# 获取该商家下cbs里的所有产品element对象,看不到也能获取到,只是结果是空,总数是正确的
all_product_element = driver.find_elements_by_xpath('//*[@id="scroll1"]/table/tbody/tr/td[2]')
# 获取所有产品的长度,因为还需要滚动条滚动,所以后面的数据是看不到的
length = len(all_product_element)
time.sleep(3)
# 通过获取总产品数,每获取一个产品就以目标元素为参考去拖动滚动条
for j in range(1, length + 1):
product_element = driver.find_element_by_xpath(
'//*[@id="scroll1"]/table/tbody/tr[' + str(j) + ']/td[2]')
cbs_all_product.append(product_element.text)
time.sleep(2)
driver.execute_script("return arguments[0].scrollIntoView();", product_element)
print(cbs_all_product)
其他扩展:
# 拉到顶部
def scroll_top(driver):
10 if driver.name == "chrome":
11 js = "var q=document.body.scrollTop=0"
12 else:
13 js = "var q=document.documentElement.scrollTop=0"
14 return driver.execute_script(js)
15
16 # 拉到底部
17 def scroll_foot(driver):
18 if driver.name == "chrome":
19 js = "var q=document.body.scrollTop=100000"
20 else:
21 js = "var q=document.documentElement.scrollTop=100000"
22 return driver.execute_script(js)