数据采集中,经常遇到动态加载的数据,我们经常使用selenium模拟浏览器操作,需要多次下拉刷新页面才能采集到所有的数据,就此总结了几种selenium操作下拉滚动条的几种方法
我这里演示的是Java版本的,使用chromedriver,当然你可以换成python或其他语言,浏览器用firefox或者phantomjs(无头浏览器),大部分都是适用的,不同浏览器有略微的差异。

初始化一个浏览器

首先要允许浏览器运行js脚本

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

1.直接操作页面

  1. #下拉到页面底部
  2. ((JavascriptExecutor) webDriver).executeScript("window.scrollTo(0,document.body.scrollHeight)");
  3. #上拉到页面顶端
  4. ((JavascriptExecutor) webDriver).executeScript("window.scrollTo(document.body.scrollHeight,0)");

或:

  1. #下拉到页面1000位置
  2. ((JavascriptExecutor) webDriver).executeScript("window.scrollTo(0,1000)");
  3. #上拉到页面顶端 0,0位置
  4. ((JavascriptExecutor) webDriver).executeScript("window.scrollTo(0,0)");

2.拖动到页面元素位置

经过测试这种方式最靠谱,在Chrome和phantomjs都测试通过,而其他方式有些网站在Chrome中没问题,但到了phantomjs中就有问题了,页面根本不动。
不过这几种方式对大部分网站应该还是都可以的。

比如要把页面拖动到id为test的元素位置,当然findElement方法还支持xpath和css选择器等多种方式

  1. String script = "return arguments[0].scrollIntoView();";
  2. WebElement element = webDriver.findElement(By.id("#test"));
  3. ((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 键
  • ...
  1. WebElement webElement = webDriver.findElement(By.cssSelector("body"));
  2. webElement.click(); // 有的时候必须点击一下,下拉才能生效(有的网站是这样,原因未找到)
  3. #小幅度下拉
  4. webElement.sendKeys(Keys.PAGE_DOWN);
  5. #或者直接下拉到底
  6. webElement.sendKeys(Keys.END);

查看源码可以看出来,selenium封装了键盘上的Key,意思是我们可以通过sendKeys发送键盘事件,比如搜索的时候点击ENTER事件

  1. public enum Keys implements CharSequence {
  2. NULL('\ue000'),
  3. CANCEL('\ue001'),
  4. HELP('\ue002'),
  5. BACK_SPACE('\ue003'),
  6. TAB('\ue004'),
  7. CLEAR('\ue005'),
  8. RETURN('\ue006'),
  9. ENTER('\ue007'),
  10. SHIFT('\ue008'),
  11. LEFT_SHIFT(SHIFT),
  12. CONTROL('\ue009'),
  13. LEFT_CONTROL(CONTROL),
  14. ALT('\ue00a'),
  15. LEFT_ALT(ALT),
  16. PAUSE('\ue00b'),
  17. ESCAPE('\ue00c'),
  18. SPACE('\ue00d'),
  19. PAGE_UP('\ue00e'),
  20. PAGE_DOWN('\ue00f'),
  21. END('\ue010'),
  22. HOME('\ue011'),
  23. LEFT('\ue012'),
  24. ARROW_LEFT(LEFT),
  25. UP('\ue013'),
  26. ARROW_UP(UP),
  27. RIGHT('\ue014'),
  28. ARROW_RIGHT(RIGHT),
  29. DOWN('\ue015'),
  30. ARROW_DOWN(DOWN),
  31. INSERT('\ue016'),
  32. DELETE('\ue017'),
  33. SEMICOLON('\ue018'),
  34. EQUALS('\ue019'),
  35. NUMPAD0('\ue01a'),
  36. NUMPAD1('\ue01b'),
  37. NUMPAD2('\ue01c'),
  38. NUMPAD3('\ue01d'),
  39. NUMPAD4('\ue01e'),
  40. NUMPAD5('\ue01f'),
  41. NUMPAD6('\ue020'),
  42. NUMPAD7('\ue021'),
  43. NUMPAD8('\ue022'),
  44. NUMPAD9('\ue023'),
  45. MULTIPLY('\ue024'),
  46. ADD('\ue025'),
  47. SEPARATOR('\ue026'),
  48. SUBTRACT('\ue027'),
  49. DECIMAL('\ue028'),
  50. DIVIDE('\ue029'),
  51. F1('\ue031'),
  52. F2('\ue032'),
  53. F3('\ue033'),
  54. F4('\ue034'),
  55. F5('\ue035'),
  56. F6('\ue036'),
  57. F7('\ue037'),
  58. F8('\ue038'),
  59. F9('\ue039'),
  60. F10('\ue03a'),
  61. F11('\ue03b'),
  62. F12('\ue03c'),
  63. META('\ue03d'),
  64. COMMAND(META),
  65. ZENKAKU_HANKAKU('\ue040');
  66. private final char keyCode;
  67. ...
  68. }

一个完整的示例

  1. public class SeleniumTest {
  2. public static void main(String[] args) throws Exception {
  3. System.setProperty("webdriver.chrome.driver", "D:/tool/chromedriver.exe");
  4. WebDriver webDriver = new ChromeDriver();
  5. webDriver.get("https://m.weibo.cn/");
  6. Thread.sleep(1000);
  7. for (int i = 0; i < 10; i++) {
  8. System.out.println("sleep 1s");
  9. Thread.sleep(1000);
  10. ((JavascriptExecutor) webDriver).executeScript("window.scrollTo(0,"+(i * 500)+")");
  11. }
  12. }
  13. }

作者:LI木水
链接:https://www.jianshu.com/p/3c6840ccf17d
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

selenium操作下拉滚动条的几种方法的更多相关文章

  1. python中selenium操作下拉滚动条方法汇总

    UI自动化中经常会遇到元素识别不到,找不到的问题,原因有很多,比如不在iframe里,xpath或id写错了等等:但有一种是在当前显示的页面元素不可见,拖动下拉条后元素就出来了. 比如下面这样一个网页 ...

  2. python中selenium操作下拉滚动条方法

    场景:在当前显示的页面元素不可见,拖动下拉条后元素就出来了. 解决方法: 在python中有几种方法解决这种问题,简单介绍下,给需要的人: 方法一)使用js脚本直接操作,方法如下: #将页面滚动条拖到 ...

  3. [Selenium2+python2.7][Scrap]爬虫和selenium方式下拉滚动条获取简书作者目录并且生成Markdown格式目录

    预计阅读时间: 15分钟 环境: win7 + Selenium2.53.6+python2.7 +Firefox 45.2  (具体配置参考 http://www.cnblogs.com/yoyok ...

  4. selenium 操作下拉处理

    操作下拉框处理 在网页中,有时候会遇到下拉框处理,这时候使用Webdriver提供的select类来处理. ##操作下拉框处理 #coding = utf-8 from selenium import ...

  5. 『心善渊』Selenium3.0基础 — 13、Selenium操作下拉菜单

    目录 1.使用Selenium中的Select类来处理下拉菜单(推荐) 2.下拉菜单对象的其他操作(了解) 3.通过元素二次定位方式操作下拉菜单(重点) (1)了解元素二次定位 (2)示例: 页面中的 ...

  6. 吾八哥学Selenium(四):操作下拉框select标签的方法

    我们在做web页面自动化测试的时候会经常遇到<select></select>标签的下拉框,那么在Python里如何实现去操作这种控件呢?今天就给大家分享一下这个玩法.为了让大 ...

  7. selenium操作下拉选和网页提示框

    import time from selenium import webdriver from selenium.webdriver.support.select import Select#处理下拉 ...

  8. Excel设置数据有效性实现单元格下拉菜单的3种方法(转)

    http://blog.csdn.net/cdefu/article/details/4129136 一.直接输入: 1.选择要设置的单元格,譬如A1单元格: 2.选择菜单栏的“数据”→“有效性”→出 ...

  9. CSS实现下拉菜单的几种方法

    PS:转自https://www.cnblogs.com/yewenxiang/p/6064117.html 第一种:display:none和display:block切换 1 <!DOCTY ...

随机推荐

  1. Android笔记(六十一)动态添加组件

    想要一个功能,点击按钮,可以在已有的布局上,新添加一组组件. 动态的创建组件,本质上还是创建组件,只不过是在程序中根据逻辑来创建.大致步骤是找到要创建控件的位置,然后将要创建的组件添加进去. 看代码: ...

  2. Flask统计代码行数

    流程: 1.获取前端的文件 2.判断文件是否zip文件 3.解压压缩包并保存 4.遍历解压后的文件夹 5.判断文件是否py文件,将绝对路径添加到列表 6.循环列表,排除注释和空号,统计行数 from ...

  3. visual studio 应用场景

  4. 网络时间同步服务和chrony

    时间同步和chrony 时间同步:多主机协作工作时,各个主机时间同步很重要,时间不一致会造成很多重要应用的故障,如:加密协议,日志,集群等, 利用NTP(Network Time Protocol) ...

  5. PAT-2019年冬季考试-乙级(题解)

    很荣幸这次能够参加乙级考试,和大佬们同台竞技了一次,这篇博客,进行介绍这次2019冬季的乙级考试题解. 7-1 2019数列 (15分) 把 2019 各个数位上的数字 2.0.1.9 作为一个数列的 ...

  6. PAT_A1059

    这是一道素数因子分解的问题: 1.先打印素数表出来,以便后期使用,素数表的大小就是10^5级别就可以,因为输入的数是long int(即就是int而已),大小最大21亿(10^10量级的),我们这里素 ...

  7. mysql存储、function、触发器等实例

    一.创建数据库&表 DROP DATABASE IF EXISTS security; CREATE database security; USE security; CREATE TABLE ...

  8. 2.遍历XML即添加修改节点

    1.xml <?xml version="1.0" encoding="utf-8" ?> <stories> <story ac ...

  9. test20190519 NOIP 模拟赛 3

    序列 [问题描述] 作为一名火星人,你为了占领地球,需要想方设法使地球人失去信心.现在你获得了一项能力,控制今后 n 天的天气温度,对于第 i 天,你能将温度控制在[ai,bi]中任意一个数字, 你的 ...

  10. 堆优化Prim 最小生成树 模板

    #include <bits/stdc++.h> using namespace std; const int MAXN = 5005; const int MAXM = 200005; ...