如何在python中使用selenium webdriver滚动网页?

时间:2014-01-08 03:44:49

标签: python selenium selenium-webdriver automated-tests

我目前正在使用selenium webdriver来解析Facebook用户朋友页面并从AJAX脚本中提取所有ID。但我需要向下滚动才能吸引所有朋友。如何在Selenium中向下滚动。我正在使用python。

18 个答案:

答案 0 :(得分:165)

您可以使用

driver.execute_script("window.scrollTo(0, Y)") 

其中Y是高度(在fullhd监视器上它是1080)。 (感谢@lukeis)

您也可以使用

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

滚动到页面底部。

如果你想要 scrool到无限加载的页面,比如社交网络,facebook等(感谢@Cong Tran)

SCROLL_PAUSE_TIME = 0.5

# Get scroll height
last_height = driver.execute_script("return document.body.scrollHeight")

while True:
    # Scroll down to bottom
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    # Wait to load page
    time.sleep(SCROLL_PAUSE_TIME)

    # Calculate new scroll height and compare with last scroll height
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height

答案 1 :(得分:57)

如果您想向下滚动到无限页面的底部(例如strptime),您可以使用以下代码:

'Food' => 
array (size=4)
  '_id' => 
    object(MongoId)[36]
      public '$id' => string '587e4a89974711036c97d3e5' (length=24)
  'CaseId' => string 'c002' (length=4)
  'Level' => string '4' (length=1)
  'food' => string 'banana' (length=6)

参考:linkedin.com

答案 2 :(得分:18)

与显示的here相同的方法:

在python中你可以使用

driver.execute_script("window.scrollTo(0, Y)")

(Y是您要滚动到的垂直位置)

答案 3 :(得分:12)

from selenium.webdriver.common.keys import Keys
html = browser.find_element_by_tag_name('html')
html.send_keys(Keys.END)

经过测试,可以正常工作

答案 4 :(得分:11)

element=find_element_by_xpath("xpath of the li you are trying to access")

element.location_once_scrolled_into_view
当我试图访问' li'那是不可见的。

答案 5 :(得分:4)

这是您向下滚动网页的方式:

driver.execute_script("window.scrollTo(0, 1000);")

答案 6 :(得分:4)

这些答案都不适用于我,至少不是为了向下滚动Facebook搜索结果页面,但我在经过大量测试后找到了这个解决方案:

while driver.find_element_by_tag_name('div'):
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    Divs=driver.find_element_by_tag_name('div').text
    if 'End of Results' in Divs:
        print 'end'
        break
    else:
        continue

答案 7 :(得分:3)

我找到解决该问题的最简单方法是选择一个标签,然后发送:

label.sendKeys(Keys.PAGE_DOWN);

希望它有效!

答案 8 :(得分:2)

出于我的目的,我想向下滚动更多,同时牢记窗口的位置。我的解决方案与此类似,并且使用了window.scrollY

driver.execute_script("window.scrollTo(0, window.scrollY + 200)")

它将转到当前的y滚动位置+ 200

答案 9 :(得分:2)

ScrollTo()函数不再起作用。这是我使用的,效果很好。

driver.execute_script("document.getElementById('mydiv').scrollIntoView();")

答案 10 :(得分:1)

我一直在寻找一种滚动浏览动态网页的方法,并在到达页面末尾并找到该线程时自动停止。

@Cuong Tran的帖子进行了主要修改,是我一直在寻找的答案。我认为其他人可能会发现此修改很有用(它对代码的工作方式有明显影响),因此,本文发布了。

修改是将捕获最后一页高度的语句移到循环内 (以便使每张支票都与上一页高度进行比较)。

因此,下面的代码:

  

连续向下滚动动态网页(.scrollTo()),仅在一次迭代中页面高度保持不变时停止。

(还有另一种修改,其中break语句位于可以删除的另一种情况下(如果页面为“ sticks”))。

    SCROLL_PAUSE_TIME = 0.5


    while True:

        # Get scroll height
        ### This is the difference. Moving this *inside* the loop
        ### means that it checks if scrollTo is still scrolling 
        last_height = driver.execute_script("return document.body.scrollHeight")

        # Scroll down to bottom
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

        # Wait to load page
        time.sleep(SCROLL_PAUSE_TIME)

        # Calculate new scroll height and compare with last scroll height
        new_height = driver.execute_script("return document.body.scrollHeight")
        if new_height == last_height:

            # try again (can be removed)
            driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

            # Wait to load page
            time.sleep(SCROLL_PAUSE_TIME)

            # Calculate new scroll height and compare with last scroll height
            new_height = driver.execute_script("return document.body.scrollHeight")

            # check if the page height has remained the same
            if new_height == last_height:
                # if so, you are done
                break
            # if not, move on to the next loop
            else:
                last_height = new_height
                continue

答案 11 :(得分:1)

滚动加载页面。示例:中,定额等

last_height = driver.execute_script("return document.body.scrollHeight")
    while True:
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight-1000);")
        # Wait to load the page.
        driver.implicitly_wait(30) # seconds
        new_height = driver.execute_script("return document.body.scrollHeight")

        if new_height == last_height:
            break
        last_height = new_height
        # sleep for 30s
        driver.implicitly_wait(30) # seconds
        driver.quit()

答案 12 :(得分:1)

如果要在特定的视图/框架中滚动(strong)(WebElement),只需将“ body”替换为要在其中滚动的特定元素。我在下面的示例中通过“ getElementById”获得该元素:

self.driver.execute_script('window.scrollTo(0, document.getElementById("page-manager").scrollHeight);')

YouTube 上就是这种情况,例如...

答案 13 :(得分:1)

这是示例硒代码段,您可以将其用于这种目的。它会转到“枚举python教程”上youtube搜索结果的网址,并向下滚动,直到找到标题为“枚举python教程(2020)”的视频。

driver.get('https://www.youtube.com/results?search_query=enumerate+python')
target = driver.find_element_by_link_text('Enumerate python tutorial(2020).')
target.location_once_scrolled_into_view

答案 14 :(得分:1)

插入这一行driver.execute_script("window.scrollBy(0,925)", "")

答案 15 :(得分:0)

此代码滚动到底部,但不需要您每次都等待。它会不断滚动,然后停在底部(或超时)

    Basic usage (Use @ionic-native/google-maps@4.8.2)
    import {
      GoogleMaps,
      GoogleMap,
      GoogleMapsEvent,
      GoogleMapOptions,
      CameraPosition,
      MarkerOptions,
      Marker,
      Environment
    } from '@ionic-native/google-maps';
    import { Component } from "@angular/core/";

    @Component({
      selector: 'page-home',
      templateUrl: 'home.html'
    })
    export class HomePage {
      map: GoogleMap;
      constructor() { }

      ionViewDidLoad() {
        this.loadMap();
      }

      loadMap() {

        // This code is necessary for browser
        Environment.setEnv({
          'API_KEY_FOR_BROWSER_RELEASE': '(your api key for `https://`)',
          'API_KEY_FOR_BROWSER_DEBUG': '(your api key for `http://`)'
        });

        let mapOptions: GoogleMapOptions = {
          camera: {
             target: {
               lat: 43.0741904,
               lng: -89.3809802
             },
             zoom: 18,
             tilt: 30
           }
        };

        this.map = GoogleMaps.create('map_canvas', mapOptions);

        let marker: Marker = this.map.addMarkerSync({
          title: 'Ionic',
          icon: 'blue',
          animation: 'DROP',
          position: {
            lat: 43.0741904,
            lng: -89.3809802
          }
        });
        marker.on(GoogleMapsEvent.MARKER_CLICK).subscribe(() => {
          alert('clicked');
        });
      }
    }

这比每次等待0.5-3秒等待响应要快得多,因为响应可能需要0.1秒

答案 16 :(得分:0)

driver.execute_script("document.getElementById('your ID Element').scrollIntoView();")

它适合我的情况。

答案 17 :(得分:0)

您可以使用 send_keys 来模拟 PAGE_DOWN 键(通常会滚动页面):

from selenium.webdriver.common.keys import Keys
html = driver.find_element_by_tag_name('html')
html.send_keys(Keys.PAGE_DOWN)