无法使分屏滚动到底部
Posted
技术标签:
【中文标题】无法使分屏滚动到底部【英文标题】:Unable to make a split screen scroll to the bottom 【发布时间】:2018-09-16 21:44:30 【问题描述】:我在 python 中结合 selenium 编写了一个脚本,以使网页的屏幕向下滚动。内容在左侧窗口内。如果我向下滚动,可以看到更多项目。我已经尝试过以下方法,但它似乎不起作用。对此的任何帮助将不胜感激。
看看这个:website link。
到目前为止我尝试过的:
import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
wait = WebDriverWait(driver, 10)
driver.get("find_the_link_above")
elem = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#pannello-espositori .luogo")))
for item in range(3):
elem.send_keys(Keys.END)
time.sleep(3)
driver.quit()
当我执行上面的脚本时,它会抛出一个异常can't focus element
。
【问题讨论】:
滚动列表:window.iScrollElenco.scrollBy(0, -10000)
感谢 Florent B. 的建议。问题是我不知道应该把window.iScrollElenco.scrollBy(0, -10000)
这部分和我的脚本放在哪里。
为什么要向下滚动?你的验证点是什么?
@Topto,driver.execute_script("window.iScrollElenco.scrollBy(0, -10000)")
。但您必须等待动态内容更新。直接发送请求以报废数据会更加容易和高效。
@Topto,如果您对他们的数据不感兴趣,为什么要添加web-scraping
标签?更不用说你在谈论抓取这个question中的数据了
【参考方案1】:
试试这个。您可以通过向上滚动到左侧面板中的元素来查看滚动效果。
此解决方案最多可滚动至前 100 个元素。
from selenium import webdriver
import time
def scroll_element_into_view(element):
driver.execute_script(
"arguments[0].scrollIntoView(true);",
element)
time.sleep(0.2) #increase/decrease time as you want delay in your view
driver = webdriver.Chrome()
driver.maximize_window()
driver.set_page_load_timeout(5)
try:
driver.get("http://catalogo.marmomac.it/it/cat")
time.sleep(3)
total_elems= driver.find_elements_by_css_selector(".scroller .elemento")
print len(total_elems)
for i in range(len(total_elems)):
scroll_element_into_view(total_elems[i])
except Exception as e:
print e
finally:
driver.quit()
正如您所提到的,滚动后它会加载更多元素。下面的脚本也会处理这个问题。在这里,我们可以使用已经显示在面板顶部的总数。
前计数是:1669
-
首先它会从 1 个元素滚动到 100 个元素
再次找到现在为 150 的总元素
所以它会从 101 滚动到 150
再次找到现在为 200 的总元素
所以它会从 150 滚动到 200
这个过程将一直持续到 1669 元素。 (将以前的计数存储在一个变量中,并在每次循环后更新)
try:
driver.get("http://catalogo.marmomac.it/it/cat")
time.sleep(3)
total_elems=0
total_count = int(driver.find_element_by_css_selector(".totali").text)
while total_elems<total_count:
elems= driver.find_elements_by_css_selector(".scroller .elemento")
found_elms= len(elems)
for i in range(total_elems,found_elms):
scroll_element_into_view(elems[i])
total_elems=found_elms
except Exception as e:
print e
finally:
driver.quit()
【讨论】:
【参考方案2】:尝试使用以下方法:
def scroll_down():
"""A method for scrolling down the page."""
# Get scroll height.
last_height = driver.execute_script("return document.querySelector('#pannello-espositori').scrollHeight;")
while True:
# Scroll down to the bottom.
driver.execute_script("window.iScrollElenco.scrollBy(0, -arguments[0]);", last_height)
# Wait to load the page.
time.sleep(2)
# Calculate new scroll height and compare with last scroll height.
new_height = driver.execute_script("return document.querySelector('#pannello-espositori').scrollHeight;")
if new_height == last_height:
break
last_height = new_height
当您想在左侧面板中向下滚动内容(使用左侧面板的高度)时使用此方法。
希望对你有帮助!让我知道结果。
【讨论】:
虽然我还没有尝试过你的答案,但脚本似乎可以工作。但是,我打开这个赏金的原因只是因为我不明白为什么我应该去寻找与dots
相关的iScrollElenco
部分,就像window.iScrollElenco.scrollBy()
一样,我应该在哪里找到它。原因 如果我不知道在这两者之间使用什么 window.<>.scrollBy()
,我如何跟踪 iScrollElenco
?这个小小的解释就足够了。谢谢。
如果在浏览器控制台调用window.iScrollElenco
,可以看到使用了IScroll
对象(来自脚本catalogo.marmomac.it/plugins/iscroll-master/build/iscroll.js)。
@Topto,怎么样?【参考方案3】:
您是否尝试过类似的方法:选项 1
execute_script("arguments[0].scrollIntoView();",element)
选项 2
from selenium.webdriver.common.action_chains import ActionChains
element = driver.find_element_by_id("my-id")
actions = ActionChains(driver)
actions.move_to_element(element).perform()
【讨论】:
可能你对elem.send_keys(Keys.END)
方法不熟悉。它成功了。但是,我没有在这里工作。我会试试你的建议。
刚刚添加了一个可能的额外解决方案。 @Topto【参考方案4】:
选择器"#pannello-espositori .luogo"
给出了面板中第一个元素中的部分文本。如果向下滚动,此元素将不再可见,并且可能无法获取更多命令。您可以找到整个列表并使用ActionChains
每次滚动到最后一个元素。它将滚动到视图中并重新加载列表
actions = ActionChains(driver)
for item in range(3):
elements = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#pannello-espositori .elemento")))
actions.move_to_element(elements[-1]).perform()
【讨论】:
以上是关于无法使分屏滚动到底部的主要内容,如果未能解决你的问题,请参考以下文章
图片无损放大软件PhotoZoom分屏预览功能 ,简直好用!
EasyNVR实时阅览四分屏状态下最后一路流无法正常播放问题排查