Yes, Nightmare, which is a high-level browser automation library for Node.js, can handle AJAX requests. It is designed to work with modern web applications that extensively rely on JavaScript and AJAX calls for dynamic content loading.
Nightmare operates by controlling an underlying Electron browser instance, allowing you to perform tasks similar to what you can do in a real browser, such as clicking elements, filling out forms, and navigating between pages. Because it controls a full browser, it inherently waits for AJAX requests to complete when performing actions that trigger those requests.
Here's an example in JavaScript using Nightmare to interact with a page that makes an AJAX request when a button is clicked:
const Nightmare = require('nightmare');
const nightmare = Nightmare({ show: true });
nightmare
.goto('https://example.com/page-with-ajax')
.click('#trigger-ajax-button') // Assume this button triggers an AJAX call
.wait('#ajax-result') // Wait for the selector that will be populated by the AJAX call
.evaluate(() => {
// Extract the text content of the result element after AJAX content is loaded
return document.querySelector('#ajax-result').textContent;
})
.end()
.then((text) => {
console.log('AJAX request completed. Content:', text);
})
.catch((error) => {
console.error('Error occurred:', error);
});
In the example above:
- We create a new Nightmare instance with
show: true
to visualize the browser window. - We navigate to a page with
.goto()
. - We click a button with the ID
#trigger-ajax-button
that is assumed to trigger an AJAX call. - We use
.wait()
to wait for an element with the ID#ajax-result
, which is expected to be populated with the AJAX request's result. - We use
.evaluate()
to run a function in the context of the page to extract the content of the result element. - Finally, we end the Nightmare instance and process the extracted content or handle any errors.
The .wait()
function can take a selector, a function, or a number of milliseconds. When waiting for AJAX, it's often best to wait for a specific selector that will be updated or added to the DOM once the AJAX request has finished.
Remember that when working with AJAX-heavy sites, timing can be an issue. You might need to use custom code to wait for certain conditions, or use .wait()
with a longer time if the AJAX request takes a variable amount of time to complete. Always ensure that your use of Nightmare respects the terms of service of the website you're automating.