Помогите пожалуйста разобраться с json-запросами

webdriver
json
rest
Теги: #<Tag:0x00007fedc7420b78> #<Tag:0x00007fedc7420a38> #<Tag:0x00007fedc74208f8>

(Алик Гилиздинов) #18

понятно, спасибо большое


(Алик Гилиздинов) #19

в продолжение вопроса:

public void cookiesReturn() throws Exception {
   final Map<String,String> cookies = get("/login").cookies();
   System.out.print(cookies.get("rememberme"); 
}

Не работает. При попытке вызвать из теста cookiesReturn(); - выдается ошибка

Теперь у меня еще начала вылезать непонятная ошибка при запуске самого браузера. В коде ничего не менял, добавил только вот это выдергивание куков.


(Stan) #20

какая ошибка?

экстрасенсы в отпуске (с) @ArtOfLife


(Алик Гилиздинов) #21

java.lang.VerifyError: class org.codehause.groovy.runtime.callsite.GroovySunClassLoader$2 overrides final method visit (IILjava/lang/String;Ljava/lang/String;(Ljava/lang/String;)V

Ошибку с запуском браузера я исправил. а вот эта вылетает при попытке выдернуть куки.


(Алик Гилиздинов) #22

Проблема еще актуальна.


(Alexey Bes) #23

На счет загрузки файла. Можно это сделать с помощью autoit. Качаете его отсюда - https://www.autoitscript.com/site/autoit/downloads/ устанавливаете.
Затем создаете файл к примеру upload_file.au3 открываете его в редакторе и там пишете код.
;ожидание пока окно станет активным
Local $handle = WinWaitActive("[CLASS:#32770]", "");
;мигание окна, просто чтобы убедиться в правильности его выбора
;можно удалить - занимает лишнее время
WinFlash($handle);
;заполнение поля диалога параметром, переданным из командной строки
ControlSetText($handle, "", "Edit1", $CmdLine[1]);
;ENTER - подтверждение (можно вместо этого нажать на кнопку)
Send("{ENTER}");

Затем Tools -> Complite что бы сделать upload_file.exe.
Затем пишете код в IDE:

public void setUploadedFile(String filePath) {

        File autoIt = new File("c:\\upload_file.exe");

        try {
            // запуск exe с передачей пути к загружаемому файлу
            // в качестве параметра
            Process p = Runtime.getRuntime().exec(
                    autoIt.getAbsolutePath() + " " + filePath);
            // ожидание выполнения запроса
            p.waitFor();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void simpleTest() {

        driver.findElement(By.xpath(".//*[@id='add-file-1']")).click();

        File file = new File("c:\\22222.jpg");
        setUploadedFile(file.getAbsolutePath());``

(Stan) #24

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

в факе - https://github.com/jayway/rest-assured/wiki/Usage#cookies-1


#25

Про куку - покажу на примере. После логина в куку auth_key пишется ключ сессии, его получаю в переменную

auth_key = expect()
.statusCode(200)
.when()
.post("/login?username=" + URLEncoder.encode(email) + "&password=" + password)
.then()
.log().ifValidationFails()
.extract().cookie("auth_key");

по пунктам:
expect:
- статускод 200
when:
- отправляю пост по адресу с именем пользователя и паролем
then:
- лог если что то пошло не так
- возвращаю куку auth_key

ключевая строчка .extract().cookie("<переменная_куки>")

По ссылке что дал вам @st_eremin вам нужно посмотреть к примеру сюда

вы ожидаете что вернется кука key1 у которой значение будет value1 после отправки GET запроса на /setCookies


(Алик Гилиздинов) #26

Этот вариант не подходит, т.к. будет куча exe файлов, что не даст собирать jar файл с тестами.


(Алик Гилиздинов) #27

падает именно на вызове cookiesReturn() из теста. т.е. если я правильно понял, то ему почему-то не нравится

Map String, String


(Алик Гилиздинов) #28

Проблема в том, что я не знаю, какое значение будет у key1. То есть я не знаю значение value1.


#29

попробуем так


(Alexey Bes) #30

exe файл будет один, он работает со всеми диалоговыми окнами. Ну в общем-то смотрите что вам необходимо в вашем случае


(Алик Гилиздинов) #31

Если я на каждое такое действие по отправке\получению через Json буду в автоите писать скрипты, у меня порядка 100-200 файлов автоита получится.


#32

То ли лыжи не едут....
Как вы в куке получаете кучу exe файлов???

Мой ответ на ваш вопрос


(Sergey Korol) #33

@Alik_Gilizdinov, а вы с вашими девелоперами принципиально не общаетесь?
Подобные вещи обычно покрываются unit/integration тестами. Что сложного спросить у разработчиков, какой должен быть формат реквеста / респонса для file upload? Они вам прям готовое решение на блюдечке предоставят в виде теста. Пусть даже если теста вовсе нет, вам все равно важно понимать, что уходит в реквесте помимо файлов (там наверняка нужна предварительная авторизация с передачей токена в заголовках).


(Алик Гилиздинов) #34

@ArtOfLife, авторизация проходит через веб-гуй, и это у меня проходит. Затем я выдергиваю куки, необходимые для загрузки файлов. А насчет общения - меня отправляют курить маны и гуглить :smile:

У нас есть тесты, которые запускаются сразу после сборки. У меня же задача - написать smoke-тесты для запуска с любой машины. В другом случае, я бы не извращался с запросами, а написал скрипты через autoIt


#35

@Alik_Gilizdinov такое чувство что мы вас пытаем

очевидно что

это вы придумали и там сессия после логина. как получить ключ сессии я вам показал.
когда будете отправлять следующий запрос на загрузку файла - не забудьте и его передать :wink:


(Алик Гилиздинов) #36

@Artyom, я сделал как Вы написали, и теперь у меня ошибка java.net.ConnectException: Connection refused: connect

Сейчас разбираюсь с этой ошибкой. Такое ощущение, что не может запустить Jetty из lib'ы


(Sergey Korol) #37

То, что происходит на UI, совершенно никак не связано с тем, что вы собираетесь сделать отдельно через post запросы. В большинстве случаев, сервер вас просто отправит "погулять" с 401 респонсом, если вы попытаетесь отправить POST без внутренней авторизации. Любое стороннее обращение к end-points без авторизации должно строго пресекаться в целях секьюрности. Т.е. если вы хотите отправить файлы, минуя UI, вам все равно нужно отдельно авторизоваться, посылая токены / куки в хэдерах удаленному сервису.

П.С. Если девелоперы посылают вас в гугл, самое время заэскалейтить этот вопрос вашему менеджменту за отказ в содействии во благо проекту. :wink: