执行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)