數據采集中,經常遇到動態加載的數據,我們經常使用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)+")"); } } }
作者:LI木水
鏈接:https://www.jianshu.com/p/3c6840ccf17d
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。