我正在使用Selenium WebDriver来抓取一个网站(例如,我也将抓取其他网站!),它具有无限滚动.
问题陈述:
向下滚动无限滚动页面,直到内容停止使用Selenium Web驱动程序加载.
我的方法: 目前我这样做 -
第1步:滚动到页面底部
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("javascript:window.onload=toBottom();"+
"function toBottom(){" +
"window.scrollTo(0,Math.max(document.documentElement.scrollHeight," +
"document.body.scrollHeight,document.documentElement.clientHeight));" +
"}");
Run Code Online (Sandbox Code Playgroud)
然后我等待一段时间让Ajax请求像这样完成 -
第2步:明确等待Ajax请求结束
了Thread.sleep(1000);
然后我给另一个java脚本来检查页面是否可滚动
第3步:检查页面是否可滚动
//Alternative to document.height is to be used which is document.body.clientHeight
//refer to https://developer.mozilla.org/en-US/docs/DOM/document.height
if((Long)js.executeScript("return " +
"(document.body.clientHeight-(window.pageYOffset + window.innerHeight))")>0)
Run Code Online (Sandbox Code Playgroud)
如果上述条件为真,那么我重复步骤1 - 3,直到步骤3中的条件为假.
问题:
我不想Thread.sleep(1000);在步骤2中给出,而是我想在后台Ajax请求结束时使用Java Script检查,如果步骤3中的条件为真,则进一步向下滚动.
PS:我不是页面的开发者所以我无法访问运行页面的代码,我可以在网页中注入java脚本(如步骤1和3中所示).并且,我必须在无限滚动期间为任何具有Ajax请求的网站编写通用逻辑.
我将感激有些人可以在这里休息一下!
编辑:好的,经过2天的努力,我发现我通过Selenium WebDriver抓取的页面可以包含任何这些JavaScript库,我将不得不根据不同的库进行池化,例如,使用jQuery api 的web应用程序,我可能正在等待
(Long)((JavascriptExecutor)driver).executeScript("return jQuery.active")
Run Code Online (Sandbox Code Playgroud)
返回零.
同样,如果Web应用程序使用Prototype JavaScript库,我将不得不等待
(Long)((JavascriptExecutor)driver).executeScript("return Ajax.activeRequestCount")
Run Code Online (Sandbox Code Playgroud)
返回零. …
我需要拦截来自页面的所有ajax请求的方法.所以我需要一些包装器来将我的数据添加到所有用户请求中.
我需要包装一个IE ajax请求,以便在发生时通知我.即我需要知道何时打开这个:
var xhr = new ActiveXObject("Microsoft.XMLHTTP");
这样做的唯一方法(我认为)是实现ActiveXObject构造函数来代理对真实构造函数/对象的开放调用.你能帮帮我吗?
另外:我不需要创建实际的xhr对象,所以请不要告诉我使用X框架,因为它很容易.
我需要知道的是在MS xhr对象上调用open(而不是我的代码).
非常感谢你!