如何在Selenium中向下滚动网页的某个元素?
基本上,我的目标是在这个元素中向下滚动,直到新的配置文件结果停止加载。
假设我要收集100个概要文件结果。
默认情况下,网页将加载30个结果。
我需要向下滚动IN THIS SECTION,等待几秒钟等待30多个结果加载,重复(直到所有结果加载)。
我可以计算结果的数量:
len (driver.find_elements(通过。XPATH,"//div [@class = '虚拟盒子']"))
我已经写了所有其他的代码,我只需要找出一行代码让Selenium向下滚动像2英寸。
我四处找了一堆,似乎找不到一个好的答案(或者我不擅长谷歌)。
这是我的一段代码:
(获取当前页面上概要文件的总数= max_prof)
while new_max_prof > max_prof:
scroll_and_wait(profile_number)
if max_prof != new_max_prof: # to make sure that they are the same
max_prof = new_max_prof
…这里是它正在调用的函数(目前不起作用,因为我不能让它滚动)
def scroll_and_wait(profile_number=profile_number): # This doesn't work yet
global profile_xpath
global new_max_prof
global max_prof
print('scrolling!')
#driver.execute_script("window.scrollTo(0,1080);") # does not work
temp_xpath = profile_xpath + str(max_prof) + ']'
element = driver.find_element(By.XPATH, temp_xpath)
ActionChains(driver).scroll_to_element(element).perform() # scrolls to the last profile
element.click() # selects the last profile
# Tested and this does not seem to load the new profiles unless you scroll down.
print('did the scroll!!!')
time.sleep(5)
new_max_prof = int(len(driver.find_elements(By.XPATH, "//div[@class='virtual-box']")))
print('new max prof is: ' + str(new_max_prof))
time.sleep(4)
我试着:
# 1。driver.execute_script("window.scrollTo(0,1080);")
和driver.execute_script("scrollTo(0, document.body.scrollHeight);") ' ' ',但似乎都没有做任何事情。
# 2。ActionChains(driver).scroll_to_element(element).perform()
希望,如果我滚动到页面上的最后一个配置文件,它会加载下一个(它没有)
# 3。使用pywin32win32api.mouse_event(MOUSEEVENTF_WHEEL, -300, 0)
模拟鼠标滚动。似乎没有工作,但即使它做了,我不确定这将解决它,因为它真的需要在网页的元素。而不仅仅是到网页的底部。
ok !我找到了有用的方法。(如果有人知道更好的解决方案,请告诉我)
您可以使用以下代码滚动到页面底部:
driver.find_element(By.TAG_NAME, 'html').send_keys(Keys.END) # works, but not inside element.
我要做的更复杂(因为我试图在页面上的一个元素中向下滚动,而不仅仅是滚动到页面的底部)。
如果你的滚动条在顶部有箭头按钮,试着用。click()或。click_and_hold()点击它们,这是一个更容易的解决方案,尝试滚动和做同样的事情。
如果,像我一样,你的滚动条没有箭头按钮,你仍然可以点击底部/顶部的滚动条路径,它会移动。如果您找到了滚动条的XPATH,那么单击它,它将在中间单击(没有帮助),但是您可以在x/y轴上使用"进行偏移。move_by_offset (0, 0),例如:
# import ActionChains
from selenium.webdriver.common.action_chains import ActionChains
scroll_bar_xpath = "//div[@ng-if='::vm.isVirtual']/div[@class='ps-scrollbar-y-rail']"
element = driver.find_element(By.XPATH, scroll_bar_xpath)
# Do stuff
ActionChains(driver).move_to_element(element).move_by_offset(0,50).click().perform()
通常,您不会想要使用固定的像素量(y轴上的50),因为如果您更改浏览器大小,或者在不同的显示器上运行程序,它可能会搞砸。
要解决这个问题,你只需要计算出滚动条的大小,这样你就知道它的底部在哪里。你所要做的就是:
element = driver.find_element(By.XPATH, scroll_bar_xpath)
size = element.size
w = size['width']
h = size['height']
print('size is: ' + size)
print(h)
print(w)
这将给你元素的大小。你想要点击它的底部,所以你可以取高度,然后把它传递给move_by_offset像这样:"。move_by_offset(0,h)"你不能这样做,因为当你选择一个元素时,它从中间开始,所以你想把这个数字切成两半(并将其四舍五入,这样就没有小数了)。这就是我最终所做的工作:
# import ActionChains
from selenium.webdriver.common.action_chains import ActionChains
import math
scroll_bar_xpath = "//div[@ng-if='::vm.isVirtual']/div[@class='ps-scrollbar-y-rail']"
element = driver.find_element(By.XPATH, scroll_bar_xpath)
size = element.size
w = size['width']
h = size['height']
#Calculate where to click
click_place = math.floor(h / 2)
# Do Stuff
ActionChains(driver).move_to_element(element).move_by_offset(0, click_place).click().perform() #50 worked
希望有帮助!
所以基本上你的要求是滚动网页的特定部分
虽然大多数可用的答案都围绕着滚动整个网页本身,但确实可以滚动整个网页的特定部分.
尽管@lukeprofits确实提供了一个完美的工作解决方案,但它有一个限制,因为有相当数量的站点,其中滚动条不是源代码中的可识别元素,因此单击以向下滚动部分。
在这种情况下,你可以做的是使用javascript操作该节。
首先确定要滚动的网页子部分
xpath_element = "//aside[@class='sidebar mCustomScrollbar_mCS_2']//div[@class='mCSB_container']"
section = driver.find_element(By.XPATH, xpath_element)
现在举个例子,假设你想滚动特定的部分3次,因此我们可以为它初始化一个计数器变量:
counter = 0
while counter < 3: # this will scroll 3 times
driver1.execute_script('arguments[0].scrollTop = arguments[0].scrollTop + arguments[0].offsetHeight;',
section)
counter += 1
# add a timer for the data to fully load once you have scrolled the section
time.sleep(5) # You might need to install time library to use this statement
这将帮助您滚动网页中的部分。请注意,您可以根据您的需求修改execute_script()
,因此,例如,如果您希望在每次尝试中滚动到部分的底部,您可以简单地使用:
driver.execute_script(
'arguments[0].scrollTop = arguments[0].scrollTop + document.getElementById("search-results-container").scrollHeight;',
section,
)
显示你想要滚动的部分的滚动高度。