相关疑难解决方法(0)

如果在网页中进行Ajax请求或使用Selenium Web驱动程序拦截XMLHttpRequest,则使用Java Script进行跟踪

我正在使用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)

返回零. …

javascript ajax xmlhttprequest selenium-webdriver

19
推荐指数
2
解决办法
7421
查看次数

如何拦截来自网页的每个AJAX请求

我需要拦截来自页面的所有ajax请求的方法.所以我需要一些包装器来将我的数据添加到所有用户请求中.

javascript ajax wrapper intercept

7
推荐指数
1
解决办法
4706
查看次数

如何修改ActiveXObject JS构造函数?

我需要包装一个IE ajax请求,以便在发生时通知我.即我需要知道何时打开这个:

var xhr = new ActiveXObject("Microsoft.XMLHTTP");

这样做的唯一方法(我认为)是实现ActiveXObject构造函数来代理对真实构造函数/对象的开放调用.你能帮帮我吗?

另外:我不需要创建实际的xhr对象,所以请不要告诉我使用X框架,因为它很容易.

我需要知道的是在MS xhr对象上调用open(而不是我的代码).

非常感谢你!

javascript ajax proxy binding

5
推荐指数
1
解决办法
2829
查看次数