Я пытаюсь вызвать метод 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-тегов, но об этом. Спасибо за вашу помощь!
Я видел подобные проблемы с обратной передачи вызовов Моя проблема заключается в том, что процесс оленья кожа 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
Добро пожаловать в Stack Overflow! Какую версию PhantomJS вы используете? Пожалуйста, зарегистрируйтесь на события 'resource.error',' page.error', 'remote.message' и' casper.page.onResourceTimeout' ([Пример] (https://gist.github.com/artjomb/4cf43d16ce50d8674fdf#file -2_caspererrors-JS)). Возможно, есть ошибки. –
Вы не ответили на мой первый вопрос. В любом случае, вам нужно выяснить, почему запрос, загружающий функцию '__doPostBack', не загружается. Это HTTPS-запрос? –