Как правильно навести курсор мыши на элемент в PhantomJS/CasperJS
На мой взгляд, проблема получения динамического контента действительно очень неоднозначна. Я пытался найти некоторую полезную информацию, использовал много разных примеров кода, конечно, модифицируя их для своих целей, но, к сожалению, безрезультатно (
Мне нужно получить некоторое содержимое отсюда. Постарайтесь подробно объяснить, с какими проблемами я столкнулся (нужно заметить, что все, что я делаю, предназначено исключительно для собственного использования!).
Главная страница веб-сайта имеет основной список навигации ( Main nav pic) со списком каждого класса "menu__category-trigger". Каждый "menu__category-trigger" имеет каждый собственный контейнер выпадающего меню. Все эти контейнеры выпадающего меню имеют родительскую оболочку с классом "menu__categories-dropdowns". Когда главная страница загружена, "menu__categories-dropdowns" пуста, там нет никакого контейнера выпадающего меню. Но когда я наведите курсор мыши на любой "menu__category-trigger", все "menu__categories-dropdowns" появляются и остаются на странице до ее перезагрузки.
Мне нужно получить этот контент с помощью PhantomJS/CasperJS, но я не могу понять, как это сделать. Мой код:
var casper = require('casper').create({
verbose: true,
logLevel: 'error',
pageSettings: {
userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4',
},
viewportSize: {
width: 1440,
height: 5000
}
});
var url = 'http://www.lamoda.ru/women-home/';
var links = [];
function getLinks() {
var links = document.querySelectorAll('.menu__column a');
return Array.prototype.map.call(links, function(e) {
return e.getAttribute('data-link');
})
};
casper.start(url, function() {
this.echo(this.getTitle());
this.echo("Got title");
});
casper.wait(2000, function() {
this.echo("I have waited for two seconds...");
});
casper.then( function() {
this.mouse.click('.popup__close'); // Doing screenshot of the page, i saw that sometimes a popup appears and blocks a possibility of hovering "menu__category-trigger"
this.echo("Popup closed");
});
casper.waitForSelector('.menu__categories-dropdowns', function(){ // main dropdowns container
console.log('Dropdown selector is loaded');
});
casper.then( function() {
casper.page.injectJs('./jquery-2.0.3.min.js');
this.evaluate(function () {
//$('body').attr('class', 'not-touch').addClass('user-unauthorized');
$('.menu__category-trigger').hover( function(){
$(this).toggleClass('menu__category-trigger_active'); // On original page hovering ".menu__category-trigger" adds it additional class ".menu__category-trigger_active" with the appearance of dropdowns
});
});
this.mouse.down('.menu__category-trigger:nth-of-type(2)'); // Hover on some navigation div
console.log('Injected JS, Nav item hovered');
});
casper.wait(5000, function() {
this.echo("I have waited for five seconds..."); // THE MAIN "WAIT" FUNCTION, i try to wait for each dropdown after hovering my navigation div (".menu__category-trigger"), but without any result
});
casper.then( function() {
this.capture('google.jpg', {
top: 0,
left: 0,
width: 1440,
height: 5000
});
console.log('Screenshot done'); // On made screenshot i see that mouse is really moved on ".menu__category-trigger:nth-of-type(2)", because it changed its text color like on original page
});
casper.then( function() {
this.echo(this.getPageContent());
links = this.evaluate(getLinks);
});
casper.then( function() {
this.echo(links.length + ' links found:');
this.echo('-' + links.join('\n -')).exit() ;
});
casper.run();
Мой каждый шаг прописан в коде)