數(shù)據(jù)采集中,經(jīng)常遇到動態(tài)加載的數(shù)據(jù)筒狠,我們經(jīng)常使用selenium模擬瀏覽器操作汪诉,需要多次下拉刷新頁面才能采集到所有的數(shù)據(jù),就此總結了幾種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.拖動到頁面元素位置
經(jīng)過測試這種方式最靠譜,在Chrome和phantomjs都測試通過认境,而其他方式有些網(wǎng)站在Chrome中沒問題胚委,但到了phantomjs中就有問題了,頁面根本不動叉信。
不過這幾種方式對大部分網(wǎng)站應該還是都可以的亩冬。
比如要把頁面拖動到id為test的元素位置,當然findElement方法還支持xpath和css選擇器等多種方式
String script = "return arguments[0].scrollIntoView();";
WebElement element = webDriver.findElement(By.id("#test"));
((JavascriptExecutor) webDriver).executeScript(script, element);
3. 發(fā)送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(); // 有的時候必須點擊一下营袜,下拉才能生效(有的網(wǎng)站是這樣撒顿,原因未找到)
#小幅度下拉
webElement.sendKeys(Keys.PAGE_DOWN);
#或者直接下拉到底
webElement.sendKeys(Keys.END);
查看源碼可以看出來,selenium封裝了鍵盤上的Key荚板,意思是我們可以通過sendKeys發(fā)送鍵盤事件凤壁,比如搜索的時候點擊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)+")");
}
}
}