我正在使用python和Webdriver从用户向下滚动页面时动态加载内容的页面中抓取数据(延迟加载)。我总共有30个数据元素,而只有15个数据元素没有先滚动显示。
我正在定位我的元素,并在多次滚动到页面底部之后以下列方式获取它们的值,直到每个元素都已加载:
# Get All Data Items
all_data = self.driver.find_elements_by_css_selector('div[some-attribute="some-attribute-value"]')
# Iterate Through Each Item, Get Value
data_value_list = []
for d in all_data:
# Get Value for Each Data item
data_value = d.find_element_by_css_selector('div[class="target-class"]').get_attribute('target-attribute')
#Save Data Value to List
data_value_list.append(data_value)
当我使用ChromeDriver执行上述代码时,将浏览器窗口保留在屏幕上,我将获取所有30个数据值以填充data_value_list
。当我使用ChromeDriver执行上述代码时,窗口最小化,我的列表data_value_list
仅填充了最初的15个数据值。
使用PhantomJS时会出现同样的问题,将data_value_list
限制为仅限于页面上最初可见的数据值。
在使用PhantomJS时,是否可以在最小化浏览器的同时加载这些类型的元素?
注意:我正在使用操作链使用以下方法.send_keys(Keys.PAGE_DOWN).perform()
向下滚动计算次数。
答案 0 :(得分:0)
我有完全相同的问题。我找到的解决方案是在虚拟浏览器中执行javascript代码以强制元素滚动到底部。
在将Javascript命令放入selenium之前,我建议在Firefox中打开您的页面并检查元素以查找可滚动内容。该元素应包含所有动态行,但它应不包含滚动条然后,在使用javascript选择元素后,可以通过将其scrollTop属性设置为其scrollHeight属性将其滚动到底部。
然后,您需要测试在浏览器中滚动内容。如果元素具有id,则选择元素的最简单方法是ID,但其他方法也可以。要选择id为“scrollableContent”的元素并将其滚动到底部,请在浏览器的javascript控制台中执行以下代码:
e = document.getElementById('scrollableContent'); e.scrollTop = e.scrollHeight;
当然,这只会将内容滚动到当前顶部,如果需要多次滚动,则需要在新内容加载后重复此操作。另外,我无法弄清楚如何找到确切的元素,对我来说这是反复试验。
这是我试过的一些代码。但是,我觉得它可以改进,应该用于那些旨在测试代码或无法预测的应用程序。我无法弄清楚如何明确等待直到加载更多元素(可能获取元素数量,滚动到底部,然后等待子元素+ 1显示,如果它们不退出循环),那么我硬编码了5个滚动事件并使用了time.sleep。 time.sleep是丑陋的,可能导致问题,部分原因是它取决于你机器的速度。
def scrollElementToBottom(driver, element_id):
time.sleep(.2)
for i in range(5):
driver.execute_script("e = document.getElementById('" + element_id + "'); e.scrollTop = e.scrollHeight;")
time.sleep(.2)
需要注意的是,以下解决方案适用于Firefox驱动程序,但我认为没有理由不应该使用您的设置。