Перейти к содержимому

Фотография

Симуляция нажатия комбинации клавиш в Selenium RC.


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 31

#1 ninfe@

ninfe@

    Новый участник

  • Members
  • Pip
  • 51 сообщений
  • Город:Калуга


Отправлено 03 ноября 2010 - 14:47

Здравствуйте. Подскажите, пожалуйста, как в Selenium-е имитировать нажатие сочетание клавиш "Alt+O" ?

Знаю что, есть команды: selenium.keyPressNative(keycode) или selenium.keyPress(locator, keySequence) Но не понимаю как записать именно сочетание клавиш.
За ранее спасибо.
  • 0

#2 vitorg

vitorg

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений

Отправлено 03 ноября 2010 - 14:53

Надо использовать последовательность нажатий через keyDownNative/keyUpNative.
  • 0

#3 frei_by

frei_by

    Постоянный участник

  • Members
  • PipPipPip
  • 177 сообщений
  • ФИО:Дмитрий

Отправлено 03 ноября 2010 - 14:58

Так сработает?

$this->keyDownNative(0x12);//public static final int VK_ALT = 0x12;
$this->keyPressNative(0x4F);//public static final int VK_O = 0x4F;
sleep(1);
$this->keyUpNative(0x12);

  • 0

#4 vitorg

vitorg

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений

Отправлено 03 ноября 2010 - 15:04

.
  • 0

#5 ekulgavaya

ekulgavaya

    Новый участник

  • Members
  • Pip
  • 50 сообщений
  • ФИО:Елена
  • Город:Minsk, Belarus


Отправлено 04 ноября 2010 - 17:09

Есть функции типа altKeyDown() и altKeyUp() - для имитации нажатия Alt
  • 0
In God we trust, the rest we test.

#6 Taras

Taras

    Новый участник

  • Members
  • Pip
  • 24 сообщений
  • ФИО:Тарас Анатольевич Мордвинов
  • Город:Донецк

Отправлено 15 ноября 2010 - 12:47

Всем привет. Вот уже 4 дня не могу найти решения. Проблема вот какая: я проверяю правильность выполнения определенного действия, если все прошло хорошо, то Alert не должен появится, если возникла проблема, то Alert с определенным текстом должен возникнуть. Так вот этот алерт Selenium не видит! getAlert() говорит что алертов небыло и продолжает работу не закрывая алерт, если закоментировать getAlert() то ошибка Unexpected Alert не возникает, т.е. этого Alerta будто нет вообще! Я уже голову себе сломал что делать, getText не помогает тоже, причем закрыть его мало, это можно сделать через PressKeyNative, мне нужно проверять наличие алерта, а isAlertPresent всегда возвращает false. Так вот я решил начать танци с бубнами, поскольку я не вижу другого выхода, содержание Alerta, т.е. его текст, можно скопировать через CTRL+C, решил сделать так, копировать текст алерта в буфер обмена через CTRL+C, потом вставлять в текстовое поле, потом брать с него текст и проверять есть ли в нем соответствующая фраза.

Пока писал меня осинило и все получилось, может кому будет нужно, расскажу. Проблема была в том, что вначале я делал так
selenium.controlKeyDown();
selenium.keyPressNative(Integer.toString(KeyEvent.VK_C));
selenium.controlKeyUp();
Такая конструкция не работает! В буфер ничего не попадает, нужно так
selenium.keyDownNative(Integer.toString(KeyEvent.VK_CONTROL));
selenium.keyPressNative(Integer.toString(KeyEvent.VK_C));
selenium.keyUpNative(Integer.toString(KeyEvent.VK_CONTROL));
Но всеже остался вопрос, может есть какая-то хитрость? Может можно это решить проще?

  • 0

#7 frei_by

frei_by

    Постоянный участник

  • Members
  • PipPipPip
  • 177 сообщений
  • ФИО:Дмитрий

Отправлено 15 ноября 2010 - 14:45

У меня недавно был такой случай, нужно было нажать на кнопку ok - и полсе этого появляется alert действие выполнено. Проблема была в том, что alert появлялся не сразу а через некоторый случайный промежуток времени - т.е. нажатие на кнопку - ajax запрос на сервер - действия на сервере - ответ в виде alert.

Если сразу писать getAlert() - то он сразу валится потому что сразу alert нету.

я в цикле ждал timeuot isAlertPresent ...

$flag=null;
        for ($i=0;$i<=3000;$i++)
        {
        $flag= $this->isAlertPresent();
            if ($flag === true)
            {
                 $this->getAlert();break;
            }
            else sleep(0.01);
        }

может быть это вам поможет.

содержание Alerta, т.е. его текст, можно скопировать через CTRL+C, решил сделать так, копировать текст алерта в буфер обмена через CTRL+C, потом вставлять в текстовое поле, потом брать с него текст и проверять есть ли в нем соответствующая фраза.


- мсье знает толк в извращениях.
  • 0

#8 ninfe@

ninfe@

    Новый участник

  • Members
  • Pip
  • 51 сообщений
  • Город:Калуга


Отправлено 15 ноября 2010 - 14:47

Извините, спасибо за ответы всем. Меня отвлекли на другую работу и поэтому эта проблема ушла на второй план.

Я пробовала написать так
selenium.keyDownNative("18");
		selenium.keyUpNative("79");


В результате у меня все умирало и помогало только перезапуск компа)) (я не блондинка)


Так сработает?

$this->keyDownNative(0x12);//public static final int VK_ALT = 0x12;
$this->keyPressNative(0x4F);//public static final int VK_O = 0x4F;
sleep(1);
$this->keyUpNative(0x12);


А обязательно делать sleep(1);?

И кстати если писать через 0x12 то ошибка:

com.thoughtworks.selenium.SeleniumException: ERROR: Problem during keyDown: For input string: "0x12"
  • 0

#9 Taras

Taras

    Новый участник

  • Members
  • Pip
  • 24 сообщений
  • ФИО:Тарас Анатольевич Мордвинов
  • Город:Донецк

Отправлено 15 ноября 2010 - 14:57

У меня недавно был такой случай, нужно было нажать на кнопку ok - и полсе этого появляется alert действие выполнено. Проблема была в том, что alert появлялся не сразу а через некоторый случайный промежуток времени - т.е. нажатие на кнопку - ajax запрос на сервер - действия на сервере - ответ в виде alert.

Если сразу писать getAlert() - то он сразу валится потому что сразу alert нету.

я в цикле ждал timeuot isAlertPresent ...

Такое решение не годится, я же сказал, что алерт явно есть, даже в пошаговом запуске скрипт его не видит, тут что-то хитрее. Я даже заворачивал в try catch в отчаянии.

содержание Alerta, т.е. его текст, можно скопировать через CTRL+C, решил сделать так, копировать текст алерта в буфер обмена через CTRL+C, потом вставлять в текстовое поле, потом брать с него текст и проверять есть ли в нем соответствующая фраза.


- мсье знает толк в извращениях.

Учитесь, мисье.
  • 0

#10 frei_by

frei_by

    Постоянный участник

  • Members
  • PipPipPip
  • 177 сообщений
  • ФИО:Дмитрий

Отправлено 15 ноября 2010 - 15:57

И кстати если писать через 0x12 то ошибка:
com.thoughtworks.selenium.SeleniumException: ERROR: Problem during keyDown: For input string: "0x12"
...
А обязательно делать sleep(1);?

Java ерунда, а php с динамическим определением типов переменных рулит. For input string: "0x12" - компилятор прав.
..делать sleep обязательно. Для более стабильного результата нужно сделать ещё
echo 'Сим салабим ахалай махалай';
...

Такое решение не годится, я же сказал, что алерт явно есть, даже в пошаговом запуске скрипт его не видит, тут что-то хитрее. Я даже заворачивал в try catch в отчаянии.

получается что у вас дальше alert тест не пойдёт, так как вы его не сняли а js остановился.
Напишите плз версию броузера в котором такое происходит. Ну и в идеале можно-ли посмотреть на странице как вызывается alert... ? Хочется самому попробовать снять его. Может быть оно не в том окне вызвыается?..

как насчёт public static final int VK_ENTER = '\n'; - т.е. на alert просто нажать Enter?
  • 0

#11 frei_by

frei_by

    Постоянный участник

  • Members
  • PipPipPip
  • 177 сообщений
  • ФИО:Дмитрий

Отправлено 15 ноября 2010 - 16:14

поскольку я не вижу другого выхода, содержание Alerta, т.е. его текст, можно скопировать через CTRL+C, решил сделать так, копировать текст алерта в буфер обмена через CTRL+C, потом вставлять в текстовое поле, потом брать с него текст и проверять есть ли в нем соответствующая фраза.


проверил, у меня WinXP ff 3.6.8 вызвыается alert на странице, с клавиатуры нажимаю ctrl+c - ничего не копируется.. ТОлько если мышью текст на алерте выделить - тогда копируется как текст сообщение алерта..
  • 0

#12 Taras

Taras

    Новый участник

  • Members
  • Pip
  • 24 сообщений
  • ФИО:Тарас Анатольевич Мордвинов
  • Город:Донецк

Отправлено 15 ноября 2010 - 16:15

И кстати если писать через 0x12 то ошибка:
com.thoughtworks.selenium.SeleniumException: ERROR: Problem during keyDown: For input string: "0x12"
...
А обязательно делать sleep(1);?

Java ерунда, а php с динамическим определением типов переменных рулит. For input string: "0x12" - компилятор прав.
..делать sleep обязательно. Для более стабильного результата нужно сделать ещё
echo 'Сим салабим ахалай махалай';
...

Такое решение не годится, я же сказал, что алерт явно есть, даже в пошаговом запуске скрипт его не видит, тут что-то хитрее. Я даже заворачивал в try catch в отчаянии.

получается что у вас дальше alert тест не пойдёт, так как вы его не сняли а js остановился.
Напишите плз версию броузера в котором такое происходит. Ну и в идеале можно-ли посмотреть на странице как вызывается alert... ? Хочется самому попробовать снять его. Может быть оно не в том окне вызвыается?..

как насчёт public static final int VK_ENTER = '\n'; - т.е. на alert просто нажать Enter?

Конечно, я его и закрываю энтером, не это проблема. Мне нужно было точно знать появился этот алерт или нет, и на самом деле даже если алерет не закрыт - тест все равно идет дальше! Сейчас впринципе код работоспособен и проверки проходят верно, просто ну уж слишком получилось, какие-то танцы с бубнами через задний карман :)
Ссылку на нашу систему дать не могу, это система видеонаблюдения. Браузеры IE8, FF3.6, одинаковый эффект. Алерт насывается сообщение вебстраницы или что-то в этом роде, на фф в названии фигурирует IP сервера. Сам текст сообщения каким-то скриптом сервера(со слов программиста) передается на JS и вызывает Алерт.
  • 0

#13 Taras

Taras

    Новый участник

  • Members
  • Pip
  • 24 сообщений
  • ФИО:Тарас Анатольевич Мордвинов
  • Город:Донецк

Отправлено 15 ноября 2010 - 16:16

поскольку я не вижу другого выхода, содержание Alerta, т.е. его текст, можно скопировать через CTRL+C, решил сделать так, копировать текст алерта в буфер обмена через CTRL+C, потом вставлять в текстовое поле, потом брать с него текст и проверять есть ли в нем соответствующая фраза.


проверил, у меня WinXP ff 3.6.8 вызвыается alert на странице, с клавиатуры нажимаю ctrl+c - ничего не копируется.. ТОлько если мышью текст на алерте выделить - тогда копируется как текст сообщение алерта..

В фф и не работает, это только для ИЕ, в нем даже текст мышкой выделить нельзя, фф кстати не всписке поддерживаемых нами платформ.
  • 0

#14 OVA

OVA

    Опытный участник

  • Members
  • PipPipPipPip
  • 405 сообщений
  • ФИО:Высоцкий Сергей Павлович
  • Город:Новосибирск

Отправлено 15 ноября 2010 - 17:25

Есть два классынх воркараунда.
1. Если хочется на ближайший алерт/конфирм нажать "OK"
selenium.chooseOkOnNextConfirmation();
selenium.click("АдскаяКнопкаКотораяСпроситХотимЛиМыОК");
2. Еще нам доки подсказывают вот такие вещи как waitForAlert()

Хотя на счет последнего не уверен, так как ни разу не пробовал)
  • 0

#15 Taras

Taras

    Новый участник

  • Members
  • Pip
  • 24 сообщений
  • ФИО:Тарас Анатольевич Мордвинов
  • Город:Донецк

Отправлено 16 ноября 2010 - 08:06

Есть два классынх воркараунда.
1. Если хочется на ближайший алерт/конфирм нажать "OK"

selenium.chooseOkOnNextConfirmation();
selenium.click("АдскаяКнопкаКотораяСпроситХотимЛиМыОК");
2. Еще нам доки подсказывают вот такие вещи как waitForAlert()

Хотя на счет последнего не уверен, так как ни разу не пробовал)

1. Это я пробовал, болт на нос, ни conformation, ни prompt, ни alert не прокатывают, нету будто ничего
2. Эта штука зафейлится 100% с ошибкой There were no alerts
  • 0

#16 frei_by

frei_by

    Постоянный участник

  • Members
  • PipPipPip
  • 177 сообщений
  • ФИО:Дмитрий

Отправлено 16 ноября 2010 - 09:12

chooseOkOnNextConfirmation();
-
У меня когда я alert ждал через некоторый случайный промежуток вермени в ответ от ajax chooseOkOnNextConfirmation(); фейлилось почему-то. Спасло только ожидание в цикле бомбить isAlertPresent каждых сотую долю секунды. Перед этим пробовал ставить sleep(10); т.е. превысить максимальное время ответа.
  • 0

#17 OVA

OVA

    Опытный участник

  • Members
  • PipPipPipPip
  • 405 сообщений
  • ФИО:Высоцкий Сергей Павлович
  • Город:Новосибирск

Отправлено 16 ноября 2010 - 09:14

Ну вообще в доке по данной мной линке пишут что под селениумом не показываются JS алерты вообще. Методы что я привел позволяют только убрать зависания и/или отловить что же за алерт, но вызывать их все надо строго до события. Они работают. Если нет, то я хотел бы взглянуть на код странички которая генерит такие интересные алерты.
Есть проблема с алертами появляющимися на onload(), но насколько я понял это не тот случай, нет?


chooseOkOnNextConfirmation();
-
У меня когда я alert ждал через некоторый случайный промежуток вермени в ответ от ajax chooseOkOnNextConfirmation(); фейлилось почему-то. Спасло только ожидание в цикле бомбить isAlertPresent каждых сотую долю секунды. Перед этим пробовал ставить sleep(10); т.е. превысить максимальное время ответа.


Вообще странно что он фейлится, потому что сам по себе он ничего не делает, кроме отмены ChooseCancelOnNextConfirmation. Надо смотреть на алерты, смотреть на код и разбираться почему не ловит. Есть там onload()? А был ли алерт? Возможно стоит дописать методы, чтобы ждало пока ajax отработает.
  • 0

#18 Taras

Taras

    Новый участник

  • Members
  • Pip
  • 24 сообщений
  • ФИО:Тарас Анатольевич Мордвинов
  • Город:Донецк

Отправлено 16 ноября 2010 - 09:37

Нет, это не onLoad. Код закрыт, не могу предоставить. Еще раз повторюсь, что проблема не том, чтоб алерт закрыть, а в том, что определить, что он был!
Насчет того, что JS Alert вообще не должны показываться это тоже интересный вопрос, показывается почему-то :search:
  • 0

#19 vitorg

vitorg

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений

Отправлено 16 ноября 2010 - 09:53

Если alert всё-таки появляется, значит Selenium не смог его отловить, а происходит такое в 99% случаев тогда когда этот alert выкинут из onLoad. Посмотрите внимательнее на код страницы, возможно там какой-нибудь iframe выкидывает этот alert в onLoad, бывают и такие кривенькие реализации.
В крайнем случае отловить наличие alert'а можно по косвенным признакам, например, зависание JS - отправляете команду getEval("1") и ждёте небольшой таймаут, если выпало с TimeoutException, значит высока вероятность, что JS повис, а всё потому, что там вылез alert. Конечно это не 100% способ, но зато самый простой в данной ситуации.
  • 0

#20 Taras

Taras

    Новый участник

  • Members
  • Pip
  • 24 сообщений
  • ФИО:Тарас Анатольевич Мордвинов
  • Город:Донецк

Отправлено 16 ноября 2010 - 10:15

Если alert всё-таки появляется, значит Selenium не смог его отловить, а происходит такое в 99% случаев тогда когда этот alert выкинут из onLoad. Посмотрите внимательнее на код страницы, возможно там какой-нибудь iframe выкидывает этот alert в onLoad, бывают и такие кривенькие реализации.
В крайнем случае отловить наличие alert'а можно по косвенным признакам, например, зависание JS - отправляете команду getEval("1") и ждёте небольшой таймаут, если выпало с TimeoutException, значит высока вероятность, что JS повис, а всё потому, что там вылез alert. Конечно это не 100% способ, но зато самый простой в данной ситуации.

Спасибо! Способ интересный, как буду оптимизировать код - перепишу страшние мансы которые есть сейчас. Программист писавший "Это" клялся, что никакого onLoad там нет, а доступа к коду страницы у меня нет, даже еслиб и был, яб сломал об него мозг, прежде чем нашел бы где вызывается этот алерт. Сами программисты там разобраться не могут, кода уже вагон и тележка.
А что делать, если это все таки OnLoad? Есть какой-нибудь способ обойти эту фичу Seleniuma?
  • 0


Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных