2015-04-30 3 views
0

Я пытаюсь автоматизировать элемент холста на веб-сайте с помощью PhantomJS или SlimerJS. Мне трудно получить элемент canvas для обнаружения моих кнопок. На снимках экрана я могу сказать, что мышь нависает над кнопками, но она отказывается щелкнуть по ним.PhantomJS/SlimerJS не может щелкнуть элемент canvas

var page = require('webpage').create() 
page.viewportSize={width: 1280, height: 768}; 
var fs = require('fs'); 
page.open('http://www.soulofsoccer.com/app/',function(){ 
    setTimeout(function(){ //wait for canvas to load 
     page.render('soccer/step1.png','png'); 
     page.sendEvent("click",50,718); //menu button 

     //test to click a second time 
     setTimeout(function(){ 
      page.sendEvent("click",50,718); 
      page.render('soccer/test1.png','png'); 
     },1000); 

     //final screenshot 
     setTimeout(function(){ 
      page.render('soccer/test.png','png'); 
      //phantom.exit(); 
      //slimer.exit(); 
     },2000); 

    },10000); //wait for canvas to load 
}); 

Может кто-нибудь, пожалуйста, сообщите мне, где моя ошибка? версия

PhantomJS: 1.9.8
SlimerJS версия: 0.9.5

ответ

1

Я только удалось заставить его работать в PhantomJS 2,0.

Я просмотрел страницу. Вы должны сначала перейти к позиции, на которую хотите щелкнуть, и только затем щелкнуть. Существует разница между перемещением мыши и настройкой позиции непосредственно щелчком. Кажется, эта страница довольно подробно касается первой регистрации перемещения мыши и только затем активировать действие click.

page.render('test19_step1.png'); 
page.sendEvent("mousemove",50,718); //menu button 

setTimeout(function(){ 
    page.sendEvent("click",50,718); 
},1000); 

setTimeout(function(){ 
    page.render('test19_test.png'); 
    phantom.exit(); 
},2000); 

Я предлагаю вам использовать абстракцию для этого:

function clickInCanvas(x, y, callback, delayBetween) { 
    delayBetween = delayBetween || 50; 
    page.sendEvent("mousemove", x, y); 

    setTimeout(function(){ 
     page.sendEvent("click", x, y); 
    }, delayBetween); 

    setTimeout(callback, delayBetween*2); 
} 
+0

Спасибо за ответ так быстро. К сожалению, это работает только иногда. Я могу запустить тест несколько раз, и это не всегда результат. –