天天看點

Java selenium操作下拉滾動條的幾種方法

資料采集中,經常遇到動态加載的資料,我們經常使用selenium模拟浏覽器操作,需要多次下拉重新整理頁面才能采集到所有的資料,就此總結了幾種selenium操作下拉滾動條的幾種方法

我這裡示範的是Java版本的,使用chromedriver,當然你可以換成python或其他語言,浏覽器用firefox或者phantomjs(無頭浏覽器),大部分都是适用的,不同浏覽器有略微的差異。

初始化一個浏覽器

首先要允許浏覽器運作js腳本

DesiredCapabilities sCaps = new DesiredCapabilities();
sCaps.setJavascriptEnabled(true);
System.getProperties().setProperty("webdriver.chrome.driver", "D:/tool/chromedriver.exe");
WebDriver webDriver  = new ChromeDriver(sCaps);           

1.直接操作頁面

#下拉到頁面底部
((JavascriptExecutor) webDriver).executeScript("window.scrollTo(0,document.body.scrollHeight)");
#上拉到頁面頂端
((JavascriptExecutor) webDriver).executeScript("window.scrollTo(document.body.scrollHeight,0)");           

或:

#下拉到頁面1000位置
((JavascriptExecutor) webDriver).executeScript("window.scrollTo(0,1000)");
#上拉到頁面頂端 0,0位置
((JavascriptExecutor) webDriver).executeScript("window.scrollTo(0,0)");           

### 2.拖動到頁面元素位置

經過測試這種方式最靠譜,在Chrome和phantomjs都測試通過,而其他方式有些網站在Chrome中沒問題,但到了phantomjs中就有問題了,頁面根本不動。

不過這幾種方式對大部分網站應該還是都可以的。

比如要把頁面拖動到id為test的元素位置,當然findElement方法還支援xpath和css選擇器等多種方式

String script = "return arguments[0].scrollIntoView();";
WebElement element = webDriver.findElement(By.id("#test"));
((JavascriptExecutor) webDriver).executeScript(script, element);           

3. 發送PAGE_DOWN、END等鍵盤事件

  • END:可以讓頁面直接下拉到底
  • HOME:上拉到頂端
  • PAGE_DOWN:小幅度下拉
org.openqa.selenium.Keys 子產品中常用的變量屬性 含義
  • Keys.DOWN, Keys.UP, Keys.LEFT,Keys.RIGHT 鍵盤箭頭鍵
  • Keys.ENTER, Keys.RETURN 回車和換行鍵
  • Keys.HOME, Keys.END,
  • Keys.PAGE_DOWN,Keys.PAGE_UP
  • Home 鍵、End 鍵、PageUp 鍵和Page Down 鍵
  • Keys.ESCAPE, Keys.BACK_SPACE,Keys.DELETE Esc、Backspace 和字母鍵
  • Keys.F1, Keys.F2, . . . , Keys.F12 鍵盤頂部的F1 到F12 鍵
  • Keys.TAB Tab 鍵
  • ...
WebElement webElement = webDriver.findElement(By.cssSelector("body"));
                webElement.click(); // 有的時候必須點選一下,下拉才能生效(有的網站是這樣,原因未找到)
#小幅度下拉
                webElement.sendKeys(Keys.PAGE_DOWN);
#或者直接下拉到底
              webElement.sendKeys(Keys.END);           

檢視源碼可以看出來,selenium封裝了鍵盤上的Key,意思是我們可以通過sendKeys發送鍵盤事件,比如搜尋的時候點選ENTER事件

public enum Keys implements CharSequence {
    NULL('\ue000'),
    CANCEL('\ue001'),
    HELP('\ue002'),
    BACK_SPACE('\ue003'),
    TAB('\ue004'),
    CLEAR('\ue005'),
    RETURN('\ue006'),
    ENTER('\ue007'),
    SHIFT('\ue008'),
    LEFT_SHIFT(SHIFT),
    CONTROL('\ue009'),
    LEFT_CONTROL(CONTROL),
    ALT('\ue00a'),
    LEFT_ALT(ALT),
    PAUSE('\ue00b'),
    ESCAPE('\ue00c'),
    SPACE('\ue00d'),
    PAGE_UP('\ue00e'),
    PAGE_DOWN('\ue00f'),
    END('\ue010'),
    HOME('\ue011'),
    LEFT('\ue012'),
    ARROW_LEFT(LEFT),
    UP('\ue013'),
    ARROW_UP(UP),
    RIGHT('\ue014'),
    ARROW_RIGHT(RIGHT),
    DOWN('\ue015'),
    ARROW_DOWN(DOWN),
    INSERT('\ue016'),
    DELETE('\ue017'),
    SEMICOLON('\ue018'),
    EQUALS('\ue019'),
    NUMPAD0('\ue01a'),
    NUMPAD1('\ue01b'),
    NUMPAD2('\ue01c'),
    NUMPAD3('\ue01d'),
    NUMPAD4('\ue01e'),
    NUMPAD5('\ue01f'),
    NUMPAD6('\ue020'),
    NUMPAD7('\ue021'),
    NUMPAD8('\ue022'),
    NUMPAD9('\ue023'),
    MULTIPLY('\ue024'),
    ADD('\ue025'),
    SEPARATOR('\ue026'),
    SUBTRACT('\ue027'),
    DECIMAL('\ue028'),
    DIVIDE('\ue029'),
    F1('\ue031'),
    F2('\ue032'),
    F3('\ue033'),
    F4('\ue034'),
    F5('\ue035'),
    F6('\ue036'),
    F7('\ue037'),
    F8('\ue038'),
    F9('\ue039'),
    F10('\ue03a'),
    F11('\ue03b'),
    F12('\ue03c'),
    META('\ue03d'),
    COMMAND(META),
    ZENKAKU_HANKAKU('\ue040');

    private final char keyCode;

...
}           

一個完整的示例

public class SeleniumTest {

    public static void main(String[] args) throws Exception {

        System.setProperty("webdriver.chrome.driver", "D:/tool/chromedriver.exe");
        WebDriver webDriver = new ChromeDriver();

        webDriver.get("https://m.weibo.cn/");
        Thread.sleep(1000);

        for (int i = 0; i < 10; i++) {
            System.out.println("sleep 1s");
            Thread.sleep(1000);
            ((JavascriptExecutor) webDriver).executeScript("window.scrollTo(0,"+(i * 500)+")");
        }
    }
}