Как передать аргументы скрипту PhantomJS из Selenium/Ghostdriver

Я могу выполнить скрипт phantomJS, который загружает веб-страницу (args[1]) и сохраняет результат html в файл (args[2]) следующим образом:

var system = require('system');
var page = require('webpage').create();
var fs = require('fs');

// Set the url address and the path
var url = system.args[1];
var path = system.args[2];

page.open(url, function () {
   fs.write(path, page.content, 'w');
   phantom.exit();
});

Я использую selenium/ghostdriver для выполнения скрипта следующим образом:

DesiredCapabilities cap = new DesiredCapabilities();
cap.setJavascriptEnabled(true);
cap.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY,".../phantomjs");

String [] phantomJsArgs = {url,path};
cap.setCapability(PhantomJSDriverService.PHANTOMJS_GHOSTDRIVER_CLI_ARGS, phantomJsArgs);

PhantomJSDriver driver = new PhantomJSDriver(cap);          
String content = new String(Files.readAllBytes(Paths.get(scriptPath)),Charset.forName("UTF-8"));
driver.executePhantomJS(content);

Этот код работает, за исключением случаев, когда я пытаюсь передать из selenium/ghostdriver 2 параметра, вызывающих url и path, в сценарий phantomJS как system.args[1] и system.args[2]. есть идеи как это сделать?


person amarincolas    schedule 20.01.2016    source источник
comment
Это действительно странный способ выполнения скрипта PhantomJS. Если вы используете привязки Java для Selenium, вам действительно следует использовать его API. Если вы хотите вызвать простой скрипт PhantomJS из Java, вызовите двоичный файл PhantomJS как подпроцесс со скриптом. Пожалуйста, не смешивайте оба, потому что вы почти наверняка столкнетесь с проблемами, когда это станет немного сложнее.   -  person Artjom B.    schedule 23.01.2016
comment
Вы имеете в виду вызов сценария PhantomJS как процесса вместо использования Ghostdriver? Я не совсем понимаю, что вы говорите о том, что вам действительно следует использовать его API. Разве я уже этого не делаю?   -  person amarincolas    schedule 25.01.2016
comment
Да, я имею в виду, что вы должны использовать Runtime#exec или аналогичный вместо выполнения того же скрипта через Ghostdriver, когда у вас есть скрипт. Если вы не ограничены сценарием, вам следует использовать API, например, открыть страницу с помощью driver и получить исходный код страницы.   -  person Artjom B.    schedule 25.01.2016


Ответы (3)


Почему бы вам просто не передать аргументы методу executePhantomJS?

driver.executePhantomJS(content, url, path);
person AdamSkywalker    schedule 20.01.2016
comment
Используя то, что вы говорите, дайте в сценарии следующие аргументы: main.js,--ip=,--port=36863,--logFile=phantomjsdriver.log,--logColor=false,--logLevel=INFO. Нет аргумента URL или аргумента пути. - person amarincolas; 20.01.2016

Что я сделал для решения проблемы, так это то, что вместо того, чтобы передавать 2 параметра в качестве аргументов (мы не в командной строке), я отредактировал файл как строку и заменил значения этих двух переменных на String.replace().

person amarincolas    schedule 20.01.2016

используйте arguments[0], arguments[1], ... для ссылки на args. http://javadox.com/com.github.detro.ghostdriver/phantomjsdriver/1.1.0/org/openqa/selenium/phantomjs/PhantomJSDriver.html

person alien    schedule 05.09.2016