无法使分屏滚动到底部

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.&lt;&gt;.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()

【讨论】:

以上是关于无法使分屏滚动到底部的主要内容,如果未能解决你的问题,请参考以下文章

Linux中如何分屏显示的命令是啥

图片无损放大软件PhotoZoom分屏预览功能 ,简直好用!

EasyNVR实时阅览四分屏状态下最后一路流无法正常播放问题排查

转: Eclipse 分屏显示同一个文件

google 分屏 横屏模式 按home键界面错乱故障分析 分屏的启动过程

Firefox浏览器分屏插件