Симуляция нажатия комбинации клавиш в Selenium RC.
#1
Отправлено 03 ноября 2010 - 14:47
Знаю что, есть команды: selenium.keyPressNative(keycode) или selenium.keyPress(locator, keySequence) Но не понимаю как записать именно сочетание клавиш.
За ранее спасибо.
#2
Отправлено 03 ноября 2010 - 14:53
#3
Отправлено 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);
#4
Отправлено 03 ноября 2010 - 15:04
#5
Отправлено 04 ноября 2010 - 17:09
#6
Отправлено 15 ноября 2010 - 12:47
Пока писал меня осинило и все получилось, может кому будет нужно, расскажу. Проблема была в том, что вначале я делал так
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));Но всеже остался вопрос, может есть какая-то хитрость? Может можно это решить проще?
#7
Отправлено 15 ноября 2010 - 14:45
Если сразу писать 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, потом вставлять в текстовое поле, потом брать с него текст и проверять есть ли в нем соответствующая фраза.
- мсье знает толк в извращениях.
#8
Отправлено 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"
#9
Отправлено 15 ноября 2010 - 14:57
Такое решение не годится, я же сказал, что алерт явно есть, даже в пошаговом запуске скрипт его не видит, тут что-то хитрее. Я даже заворачивал в try catch в отчаянии.У меня недавно был такой случай, нужно было нажать на кнопку ok - и полсе этого появляется alert действие выполнено. Проблема была в том, что alert появлялся не сразу а через некоторый случайный промежуток времени - т.е. нажатие на кнопку - ajax запрос на сервер - действия на сервере - ответ в виде alert.
Если сразу писать getAlert() - то он сразу валится потому что сразу alert нету.
я в цикле ждал timeuot isAlertPresent ...
Учитесь, мисье.содержание Alerta, т.е. его текст, можно скопировать через CTRL+C, решил сделать так, копировать текст алерта в буфер обмена через CTRL+C, потом вставлять в текстовое поле, потом брать с него текст и проверять есть ли в нем соответствующая фраза.
- мсье знает толк в извращениях.
#10
Отправлено 15 ноября 2010 - 15:57
Java ерунда, а php с динамическим определением типов переменных рулит. For input string: "0x12" - компилятор прав.И кстати если писать через 0x12 то ошибка:
com.thoughtworks.selenium.SeleniumException: ERROR: Problem during keyDown: For input string: "0x12"
...
А обязательно делать sleep(1);?
..делать sleep обязательно. Для более стабильного результата нужно сделать ещё
echo 'Сим салабим ахалай махалай';...
получается что у вас дальше alert тест не пойдёт, так как вы его не сняли а js остановился.Такое решение не годится, я же сказал, что алерт явно есть, даже в пошаговом запуске скрипт его не видит, тут что-то хитрее. Я даже заворачивал в try catch в отчаянии.
Напишите плз версию броузера в котором такое происходит. Ну и в идеале можно-ли посмотреть на странице как вызывается alert... ? Хочется самому попробовать снять его. Может быть оно не в том окне вызвыается?..
как насчёт public static final int VK_ENTER = '\n'; - т.е. на alert просто нажать Enter?
#11
Отправлено 15 ноября 2010 - 16:14
поскольку я не вижу другого выхода, содержание Alerta, т.е. его текст, можно скопировать через CTRL+C, решил сделать так, копировать текст алерта в буфер обмена через CTRL+C, потом вставлять в текстовое поле, потом брать с него текст и проверять есть ли в нем соответствующая фраза.
проверил, у меня WinXP ff 3.6.8 вызвыается alert на странице, с клавиатуры нажимаю ctrl+c - ничего не копируется.. ТОлько если мышью текст на алерте выделить - тогда копируется как текст сообщение алерта..
#12
Отправлено 15 ноября 2010 - 16:15
Конечно, я его и закрываю энтером, не это проблема. Мне нужно было точно знать появился этот алерт или нет, и на самом деле даже если алерет не закрыт - тест все равно идет дальше! Сейчас впринципе код работоспособен и проверки проходят верно, просто ну уж слишком получилось, какие-то танцы с бубнами через задний карман :)Java ерунда, а php с динамическим определением типов переменных рулит. For input string: "0x12" - компилятор прав.И кстати если писать через 0x12 то ошибка:
com.thoughtworks.selenium.SeleniumException: ERROR: Problem during keyDown: For input string: "0x12"
...
А обязательно делать sleep(1);?
..делать sleep обязательно. Для более стабильного результата нужно сделать ещёecho 'Сим салабим ахалай махалай';...получается что у вас дальше alert тест не пойдёт, так как вы его не сняли а js остановился.Такое решение не годится, я же сказал, что алерт явно есть, даже в пошаговом запуске скрипт его не видит, тут что-то хитрее. Я даже заворачивал в try catch в отчаянии.
Напишите плз версию броузера в котором такое происходит. Ну и в идеале можно-ли посмотреть на странице как вызывается alert... ? Хочется самому попробовать снять его. Может быть оно не в том окне вызвыается?..
как насчёт public static final int VK_ENTER = '\n'; - т.е. на alert просто нажать Enter?
Ссылку на нашу систему дать не могу, это система видеонаблюдения. Браузеры IE8, FF3.6, одинаковый эффект. Алерт насывается сообщение вебстраницы или что-то в этом роде, на фф в названии фигурирует IP сервера. Сам текст сообщения каким-то скриптом сервера(со слов программиста) передается на JS и вызывает Алерт.
#13
Отправлено 15 ноября 2010 - 16:16
В фф и не работает, это только для ИЕ, в нем даже текст мышкой выделить нельзя, фф кстати не всписке поддерживаемых нами платформ.поскольку я не вижу другого выхода, содержание Alerta, т.е. его текст, можно скопировать через CTRL+C, решил сделать так, копировать текст алерта в буфер обмена через CTRL+C, потом вставлять в текстовое поле, потом брать с него текст и проверять есть ли в нем соответствующая фраза.
проверил, у меня WinXP ff 3.6.8 вызвыается alert на странице, с клавиатуры нажимаю ctrl+c - ничего не копируется.. ТОлько если мышью текст на алерте выделить - тогда копируется как текст сообщение алерта..
#14
Отправлено 15 ноября 2010 - 17:25
1. Если хочется на ближайший алерт/конфирм нажать "OK"
selenium.chooseOkOnNextConfirmation(); selenium.click("АдскаяКнопкаКотораяСпроситХотимЛиМыОК");2. Еще нам доки подсказывают вот такие вещи как waitForAlert()
Хотя на счет последнего не уверен, так как ни разу не пробовал)
#15
Отправлено 16 ноября 2010 - 08:06
1. Это я пробовал, болт на нос, ни conformation, ни prompt, ни alert не прокатывают, нету будто ничегоЕсть два классынх воркараунда.
1. Если хочется на ближайший алерт/конфирм нажать "OK"selenium.chooseOkOnNextConfirmation(); selenium.click("АдскаяКнопкаКотораяСпроситХотимЛиМыОК");2. Еще нам доки подсказывают вот такие вещи как waitForAlert()
Хотя на счет последнего не уверен, так как ни разу не пробовал)
2. Эта штука зафейлится 100% с ошибкой There were no alerts
#16
Отправлено 16 ноября 2010 - 09:12
-
У меня когда я alert ждал через некоторый случайный промежуток вермени в ответ от ajax chooseOkOnNextConfirmation(); фейлилось почему-то. Спасло только ожидание в цикле бомбить isAlertPresent каждых сотую долю секунды. Перед этим пробовал ставить sleep(10); т.е. превысить максимальное время ответа.
#17
Отправлено 16 ноября 2010 - 09:14
Есть проблема с алертами появляющимися на onload(), но насколько я понял это не тот случай, нет?
chooseOkOnNextConfirmation();
-
У меня когда я alert ждал через некоторый случайный промежуток вермени в ответ от ajax chooseOkOnNextConfirmation(); фейлилось почему-то. Спасло только ожидание в цикле бомбить isAlertPresent каждых сотую долю секунды. Перед этим пробовал ставить sleep(10); т.е. превысить максимальное время ответа.
Вообще странно что он фейлится, потому что сам по себе он ничего не делает, кроме отмены ChooseCancelOnNextConfirmation. Надо смотреть на алерты, смотреть на код и разбираться почему не ловит. Есть там onload()? А был ли алерт? Возможно стоит дописать методы, чтобы ждало пока ajax отработает.
#18
Отправлено 16 ноября 2010 - 09:37
Насчет того, что JS Alert вообще не должны показываться это тоже интересный вопрос, показывается почему-то
#19
Отправлено 16 ноября 2010 - 09:53
В крайнем случае отловить наличие alert'а можно по косвенным признакам, например, зависание JS - отправляете команду getEval("1") и ждёте небольшой таймаут, если выпало с TimeoutException, значит высока вероятность, что JS повис, а всё потому, что там вылез alert. Конечно это не 100% способ, но зато самый простой в данной ситуации.
#20
Отправлено 16 ноября 2010 - 10:15
Спасибо! Способ интересный, как буду оптимизировать код - перепишу страшние мансы которые есть сейчас. Программист писавший "Это" клялся, что никакого onLoad там нет, а доступа к коду страницы у меня нет, даже еслиб и был, яб сломал об него мозг, прежде чем нашел бы где вызывается этот алерт. Сами программисты там разобраться не могут, кода уже вагон и тележка.Если alert всё-таки появляется, значит Selenium не смог его отловить, а происходит такое в 99% случаев тогда когда этот alert выкинут из onLoad. Посмотрите внимательнее на код страницы, возможно там какой-нибудь iframe выкидывает этот alert в onLoad, бывают и такие кривенькие реализации.
В крайнем случае отловить наличие alert'а можно по косвенным признакам, например, зависание JS - отправляете команду getEval("1") и ждёте небольшой таймаут, если выпало с TimeoutException, значит высока вероятность, что JS повис, а всё потому, что там вылез alert. Конечно это не 100% способ, но зато самый простой в данной ситуации.
А что делать, если это все таки OnLoad? Есть какой-нибудь способ обойти эту фичу Seleniuma?
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных