- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 Nightmare.js 来抓取公共(public)记录,并且只是想让抓取工具等待下一页加载。我正在抓取搜索结果,然后按下一步按钮(显然)进入下一页。我无法使用 nightmare.wait(someConstTime)
准确等待下一页加载,因为有时 someConstTime
比加载下一页所需的时间短(尽管它总是低于 30 秒)。我也无法使用 nightmare.wait(selector) ,因为所有结果页面上始终存在相同的选择器。在这种情况下, Nightmare 基本上根本不会等待,因为选择器已经存在(在我已经抓取的页面上),因此它将继续多次抓取同一页面,除非新页面在下一个循环之前加载。
点击下一步按钮后,如何有条件地等待下一页加载?
如果我能弄清楚如何 - 我会将当前页面 (currentPageStatus
) 的“显示 # 到 # of## 条目”指示器与最后一个已知值 (lastPageStatus
)并等待它们不同(因此加载下一页)。
我会使用 https://stackoverflow.com/a/36734481/3491991 中的代码来做到这一点但这需要将 lastPageStatus
传递到 deferredWait
(我无法弄清楚)。
这是我到目前为止得到的代码:
// Load dependencies
//const { csvFormat } = require('d3-dsv');
const Nightmare = require('nightmare');
const fs = require('fs');
var vo = require('vo');
const START = 'http://propertytax.peoriacounty.org';
var parcelPrefixes = ["01","02","03","04","05","06","07","08","09","10",
"11","12","13","14","15","16","17","18","19"]
vo(main)(function(err, result) {
if (err) throw err;
});
function* main() {
var nightmare = Nightmare(),
currentPage = 0;
// Go to Peoria Tax Records Search
try {
yield nightmare
.goto(START)
.wait('input[name="property_key"]')
.insert('input[name="property_key"]', parcelPrefixes[0])
// Click search button (#btn btn-success)
.click('.btn.btn-success')
} catch(e) {
console.error(e)
}
// Get parcel numbers ten at a time
try {
yield nightmare
.wait('.sorting_1')
isLastPage = yield nightmare.visible('.paginate_button.next.disabled')
while (!isLastPage) {
console.log('The current page should be: ', currentPage); // Display page status
try {
const result = yield nightmare
.evaluate(() => {
return [...document.querySelectorAll('.sorting_1')]
.map(el => el.innerText);
})
// Save property numbers
// fs.appendFile('parcels.txt', result, (err) => {
// if (err) throw err;
// console.log('The "data to append" was appended to file!');
// });
} catch(e) {
console.error(e);
return undefined;
}
yield nightmare
// Click next page button
.click('.paginate_button.next')
// ************* THIS IS WHERE I NEED HELP *************** BEGIN
// Wait for next page to load before continue while loop
try {
const currentPageStatus = yield nightmare
.evaluate(() => {
return document.querySelector('.dataTables_info').innerText;
})
console.log(currentPageStatus);
} catch(e) {
console.error(e);
return undefined;
}
// ************* THIS IS WHERE I NEED HELP *************** END
currentPage++;
isLastPage = yield nightmare.visible('.paginate_button.next.disabled')
}
} catch(e) {
console.error(e)
}
yield nightmare.end();
}
最佳答案
我有一个类似的问题,但我设法解决了。基本上我必须导航到搜索页面,选择“每页 100”选项,然后等待刷新。唯一的问题是,手动等待时间是否允许 AJAX 触发并重新填充超过 10 个结果(默认)是一个冒险。
我最终这样做了:
nightmare
.goto(url)
.wait('input.button.primary')
.click('input.button.primary')
.wait('#searchresults')
.select('#resultsPerPage',"100")
.click('input.button.primary')
.wait('.searchresult:nth-child(11)')
.evaluate(function() {
...
}
.end()
有了这个,评估将不会触发,直到它检测到至少 11 个具有 .searchresult 类的 div。由于默认值为 10,因此必须等待重新加载才能完成。
您可以扩展此功能以从第一页中抓取可用结果的总数,以确保(就我而言)有超过 10 个可用结果。但这个概念的基础是有效的。
关于javascript - 单击链接后让 Nightmare 等待下一页加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44060214/
好吧,我用 Nightmare 来做一些测试任务,对于基于电子和phatomjs的代码来说是如此的好。 现在,我有一个问题,我该如何通过 Nightmare 上传图像文件? 好吧,我找到了一个名为ni
我找不到这方面的任何信息,主要是因为一旦我在同一句话上输入带有“Nightmare ”和“IE”的google搜索,您就会知道... 有没有办法像在IE兼容模式下一样运行nightmare.js? 最
我试图从网站中提取数据,我想在 10 分钟后循环查看数据是否已更改。我认为将我的功能打包在模块中是一个好主意,但现在我坚持将我当前的 Nightmare 实例从登录模块转移到数据模块。 开始.js v
我很难过要在Travis CI上运行它。它会间歇性地工作,但 Nightmare 通常会因以下错误而失败: nightmare:log did-get-response-details [{},f
使用nightmarejs如何在文件输入中输入文件并进行确认? 它用于附件的自动化(例如电子邮件)。我的意思是输入文件是这样的: 最佳答案 我所知道的使用Nightmare进行上传的唯一方法是使用de
我想抓取并通过页面中的每个herf获取html,然后输出到csv。现在我第一次使用 Nightmare 。所以我对未定义的段落有疑问。 var Nightmare = require('nightma
var Nightmare = require('nightmare'); var nightmare = Nightmare({ show: true }); var fs = require('
我目前正在开发一个程序来自动化某个网站上的任务(简化代码如下)。我很好地登录,然后等待页面加载,但是wait函数永远不会结束。我尝试使用wait(200),但是评估函数返回一个空数组。我100%确信网
我尝试在F12时单击包含这些详细信息的按钮 Show all results for 'lundhags' 我已经复制了xpath并且有这样的代码=>I.click('//*[@id="9"]');
我在javascript中使用Nightmare创建网络抓取工具,但是评估功能未返回正确的信息。似乎它能够返回原始类型(int,字符串等),但不能返回“querySelectorAll”中的元素列表。
我正在尝试NightmareJS进行一些我想完成的自动化操作。我遇到的一个问题是, Nightmare/Electron 无法解析adidas网站,但是它可以解析并访问任何其他网页。 This is
我想使用 Nightmare JS 通过检查状态代码 200 来确定页面是否正在加载。我查看了 goto 选项,但无法弄清楚。大家有什么想法吗? var Nightmare = require('ni
我刚刚开始使用 Nightmare 。我在我的网页上使用它用于测试目的。 我有以下用户界面。 menu tab1 | tab2 | tab3 ......(dynamically generated
如何使用 nightmare-iframe 插件访问具有随机生成名称的 iframe? 我试过了 var name = yield nightmare .goto(defaultUrl) .c
如何在服务器上通过pm2或类似的东西运行nightmarejs,因为 Nightmare 使用电子,而电子现在需要图形,我正在使用xvfb-run npm start ,但是这个 sol° 需要我通过
下面的代码片段是来自 https://github.com/segmentio/nightmare 的示例 const Nightmare = require('nightmare') const n
我知道在任何环境中处理日期都可能会非常令人困惑,但我正处于一场噩梦中,这个函数本应该是一项微不足道的工作。我想以不同的方式操作某些日期,但出现错误或错误的结果。 下面我将报告一个非常简单的例子来测试执
我有以下代码: for(var i = 0; i { return true; }) } 我正在 Electron 应用程序中使用它。然而,这会执行异步,我会立
我正在尝试使用 github.com/segmentio/nightmare 自动化 2 个站点 例子: 我想继续访问 site_1(临时电子邮件服务)并获得电子邮件。 然后转到 site_2 并填写
我正在尝试使用 Nightmare 抓取网页,但想等待 #someelem 出现,前提是它确实存在。否则,我希望 Nightmare 继续前进。如何使用 .wait() 完成此操作? 我不能使用 .w
我是一名优秀的程序员,十分优秀!