2016-07-16 6 views
1

Я пытаюсь вызвать метод javascript с использованием CasperJS. Веб-страница просто состоит из ссылки, которая позволяет мне вернуться к моей стране по умолчанию.CasperJS Вызывать функцию Javascript на консоли браузера

<a id="defaultCountry" href="javascript:__doPostBack('cty$UK$default','')">Default Country</a> 

Я хочу, чтобы CasperJS вызывал метод javascript, который вызывается после нажатия ссылки. Я посчитал, что подражая щелчку мыши по ссылке будет вызывать метод javascript, но это не так. Я попытался следующие методы не имел успеха:

casper.then(function() { 
     casper.click(x('//*[@id="defaultCountry"]')); 
     casper.evaluate(function() { 
       __doPostBack('cty$UK$default',''); //this is the javascript function. im not sure if thats how you would call it though 
     }); 

или

this.clickLabel('Default Country', 'a'); 

Я знаю, что если я призываю яваскрипт функцию на консоли браузера, он будет работать. Я просто печатаю:

__doPostBack('cty$UK$default',''); 

в консоли и это магически работает. Любая помощь ценится!


Edit:

@Rippo Это фрагмент того, что я побежал. Кажется, что CasperJS обходит мое утверждение eval. Последние несколько строк находятся непосредственно на консоли. Я знаю, что моя страница загружается с помощью селектора из-за скриншота. Я даже использовал метод casper.waitforselector для подтверждения.

casper.thenOpen('http://example.com'); 

casper.wait(5000, function() { 
    console.log('page opened'); 
    casper.capture('page.png'); 
    console.log('capture page complete'); 
}); 

casper.thenEvaluate(function() { 
    console.log('invoking javascript'); 
    __doPostBack('cty$UK$default',''); 
    console.log('javascript invoked'); 
}); 

Это из консоли:

[info] [phantom] wait() finished waiting for 5000ms. 
page opened 
[debug] [phantom] Capturing page to C:/Users/page.png 
[info] [phantom] Capture saved to C:/Users/page.png 
capture page complete 
[info] [phantom] Step _step 8/8 http://example.com (HTTP 200) 
[info] [phantom] Step _step 8/8: done in 16240ms. 
[info] [phantom] Done 8 steps in 16259ms 
[debug] [phantom] Navigation requested: url=about:blank, type=Other, willNavigate=true, isMainFrame=true 
[debug] [phantom] url changed to "about:blank" 

Это последняя строка из консоли, прежде чем она выходит.


Редактировать 7/17/2016 12:40 утра

@Artjom B. Вот фрагмент кода, я столкнулся с вашими предложениями:

...snipped some prior  
function() { 
    console.log('Page loaded'); 
    casper.capture('page.png'); 
    console.log('Starting 1st postback call'); 
    this.evaluate(function() { 
     console.log('postback call'); 
     __doPostBack('cty$UK$default',''); 
     }); 
    console.log('passed postback'); 
    casper.capture('post-postback.png'); 

//At this point, it skips this function and goes straight to console.log then comes back to this function. Not sure why... 
casper.then(function() { 
    console.log('trying to change again'); 
    this.click(x('//*[@id="defaultCountry"]')); 
    this.evaluate(function() { 
     __doPostBack('cty$UK$default',''); 
     console.log('javascript invoked'); 
    }); 
}); 

//skipped to this console.log 
console.log('waiting country to change'); 
this.waitForSelector('.countryuk', 
    function() { 
     console.log('country change completed. Capturing image'); 
     this.capture('uk.png'); 
    }, 

    function() { 
     console.log('timed out waiting for country to change.'); 
     this.capture('uk-timeout.png'); 
    },5000); 

};

Вот консольный вывод:

Page loaded 
[debug] [phantom] Capturing page to C:/Users/page.png 
[info] [phantom] Capture saved to C:/Users/page.png 
Starting 1st postback call 
Console: postback call 
Error: ReferenceError: Can't find variable: __doPostBack 
passed postback 
[debug] [phantom] Capturing page to C:/Users/post-postback.png 
[info] [phantom] Capture saved to C:/Users/post-postback.png 
waiting country to change 
[info] [phantom] Step anonymous 10/11 http://example.com/page.aspx?r=2 (HTTP 200) 
trying to change again 
[debug] [phantom] Mouse event 'mousedown' on selector: xpath selector: //*[@id="defaultCountry"] 
[debug] [phantom] Mouse event 'mouseup' on selector: xpath selector: //*[@id="defaultCountry"] 
[debug] [phantom] Mouse event 'click' on selector: xpath selector: //*[@id="defaultCountry"] 
Error: ReferenceError: Can't find variable: __doPostBack 
Error: ReferenceError: Can't find variable: __doPostBack 
[info] [phantom] Step anonymous 10/11: done in 22567ms. 
[info] [phantom] Step _step 11/11 http://example.com/page.aspx?r=2 (HTTP 200) 
[info] [phantom] Step _step 11/11: done in 22573ms. 
[warning] [phantom] Casper.waitFor() timeout 
timed out waiting for country to change. 
[debug] [phantom] Capturing page to C:/Users/uk-timeout.png 
[info] [phantom] Capture saved to C:/Users/uk-timeout.png 
[info] [phantom] Done 11 steps in 27825ms 
[debug] [phantom] Navigation requested: url=about:blank, type=Other, willNavigate=true, isMainFrame=true 
[debug] [phantom] url changed to "about:blank" 

Ясно, что не может найти функцию обратной передачи. Однако я не знаю, почему. Это не скрытый элемент. Это точно так же, как я написал выше (ссылка). Он вложен в кучу div-тегов, но об этом. Спасибо за вашу помощь!

+0

Я видел подобные проблемы с обратной передачи вызовов Моя проблема заключается в том, что процесс оленья кожа Casperjs моя функция Eval, и я не знаю, почему. https: // StackOverflow.com/questions/25107976/can not-navigate-with-casperjs-evaluation-and-dopostback-function https://stackoverflow.com/questions/17830597/casperjs-how-to-call-dopostback – kubermeso

+0

Добро пожаловать в Stack Overflow! Какую версию PhantomJS вы используете? Пожалуйста, зарегистрируйтесь на события 'resource.error',' page.error', 'remote.message' и' casper.page.onResourceTimeout' ([Пример] (https://gist.github.com/artjomb/4cf43d16ce50d8674fdf#file -2_caspererrors-JS)). Возможно, есть ошибки. –

+0

Вы не ответили на мой первый вопрос. В любом случае, вам нужно выяснить, почему запрос, загружающий функцию '__doPostBack', не загружается. Это HTTPS-запрос? –

ответ

0

Вы можете получить доступ к href ссылки и использовать функцию eval.

var str = document.getElementById("defaultCountry").href; 
eval(str.substring(str.indexOf(":") + 1)); 
+0

Как только я объявляю var str, выходит CasperJS. Я ставлю console.log до и после вашего кода. Он будет интерпретировать console.log раньше, но не после. – kubermeso

+0

@kubermeso Что значит «вырывается»? Где вы размещаете декларацию и вызов eval? – afuous

+0

См. Мое редактирование выше. Я помещаю ваши заявления в функцию casper.thenEvaluate. Я также проверил его с casper.wait. Ни работа, ни casperjs просто обходят код – kubermeso

1

насчет просто (удалить casper.then и casper.click)

casper.thenEvaluate(function() { 
     __doPostBack('cty$UK$default',''); 
}); 
+0

в качестве дополнительной заметки 'console.log ('invocation javascript');' внутри оценивать с помощью эха в консоли веб-браузеров, а не из командной консоли, из которой вы ее запускаете. Интересно, закончила ли JS загрузка? Я подозреваю, что у вас ошибка JS где-то на странице. См. Комментарий @artjom – Rippo

Смежные вопросы