та да , ето задача API-шки или JS екзекютора…сомневаюсь что webdriver “сам по себе” как то тут поможет
взял кусок js
var obs = [],
point = {
coord: {
latitude: 5.2145, longitude: 52.2145, accuracy: 15}
};
setPosition = function(lat, lon) {
point.coord.latitude = lat;
point.coord.longitude = lon;
for (var idx=0; idx < obs.length; idx++) {
obs[idx](point);
}
};
вызвал это в Java:
ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript");
engine.eval(new FileReader("src/jscripts/geolocation.js"));
Invocable invocable = (Invocable) engine;
Object result = invocable.invokeFunction("setPosition", "5.2145, 52.2145");
System.out.println(result);
driver = new FirefoxDriver();
//driver.manage().deleteAllCookies();
driver.get("http://www.msn.com/");
и все равно у меня не меняются координаты, меня бросает на текущие
хм…почему то result null
А почему именно этот кусок? Сам по себе он ничего не делает
еще один момент, при чтении js файла с java у меня естественно ругается на отсутствие либ для js:
javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: “describe” is not defined. (#4) in at line number 4
не подскажете как это решается, в js просто npn инсталит это все…а как тут быть хз…
какой describe? ты его из первого самого примера взял? тебе не нужны никакие жс либы, мой пример на чистом js.
это я вижу, но когда вызываю его из java кода то мне выдает ошибку, ошибка логичная, ибо оно не видит либ с жс…либо я чегото неправвильно понимаю либо чтото неправильно делаю
Тебе не нужен describe() из первого примера по ссылке. Этот пример чисто для mocha, жс-ного тестового фреймворка.
Все что тебе надо - замОкать несколько нативных функций в жс-е (выше в моем примере с кодом). Вызови этот код в контексте страницы, в которой выполняется тест. Ты все правильно сделал в предыдущем комменте, но вызвал только тебе нужен не только setPosition (который по сути не делает ничего), тебе нужно еще и переназначить clearWatch, watchPosition и getCurrentPosition (последняя по сути самая главная, которая и отвечает за нахождение в данный момент).
все равно это как то сложно, пока сроки не поджимают попробую поискать какое то решение попроще
наткнулся на такую либу
может это оно?
FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("geo.prompt.testing", true);
profile.setPreference("geo.prompt.testing.allow", true);
profile.setPreference("geo.enabled", true);
profile.setPreference("geo.wifi.uri", "file:///D:/trash/location.json");
работает
осталось разобратся как это настроить на chrom
c хромом с версии 29 не получится они к урлу добавляют GET параметры, которые ломают json.
да уж, то что есть работает только с сайтом bestvpn.org
на msn и картах гугл не работает…бред бредовый, теперь бы узнать заработает ли это с нашим внутренним апи которое пишеться (
Карты гугла используют свои мОки встроенного апи, поэтому там есть воркэраунды. Чтобы не париться что и как надо переназначать, уже есть готовое решение (проверял, работает):
и сново уперся в ту же ошибку
после
WebDriver driver = new FirefoxDriver();
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
// read script file
engine.eval(Files.newBufferedReader(Paths.get("src/jscripts/min.js"), StandardCharsets.UTF_8));
Invocable inv = (Invocable) engine;
// call function from script file
inv.invokeFunction("GeoSim", "param");
driver.get("https://www.google.com.ua/maps");
}
Exception in thread “main” javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: “window” is not defined
как то не сложилось у меня с JS
Потому что никакого контекста window у тебя нет. Тебе сначала надо перейти на нужную страницу и только потом в ее контексте выполнять жс.
пробовал и такой вариант, те. сначала делаю “driver.get…” а потом запускаю скрипт…результат тот же
Исправлено
проблема была в том что я вызывал независимо скрипт, после вызова с под вебдрайвера все заработало.
и еще вопрос, я в упор не вижу в библиотеке geoАpi метода который будет делать чтото похожее на setPosition…
Потому что он есть в моем коде из первого примера, но нет в той библиотеке.
к слову, написал свой, с блекджеком и автоматизаторшами, решил эту проблему? могу выложить
Конечно выкладывайте! Тем более если это поможет решить задачу автору вопроса
https://github.com/fat-troll/js-geo-mock
На следующей неделе выложу обновленную версию, с автоопределением скорости при ее мокании и мелкими фиксами, но и эта отлично работает