Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Сэмулировать нажатие комбинации клавиш


(lily) #1

Привет! Есть такая вот беда.

Для открытия формы в приложении используется нажатие комбинации клавиш на клавиатуре. (CTRL+L).  Вызывается Js' ом  данная форма. Как можно подобное действие описать при помощи WebDriver  (Java, PageObject model)?

Selenium IDE не записывает никак эту имитацию... потому тест при Play валится.

Далнейшая работа в форме +/- записывается и воспроизводится.

Может кто сталкивался и сможет подсказать? 

Заранее спасибо!


(user12) #2

http://software-testing.ru/forum/index.php?/topic/16717/

 

см. последний коммент

Сам код я, к сожелению, не проверял. Но, имхо, должно работать


(Alexander Petrovich) #3

На джава - Actions

На пайтон - ActionChains 

http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/interactions/Actions.html

Владейте :)


(lily) #4

пока не очень удается "завладеть".. может есть у кого примеры своей реализации?

 

http://software-testing.ru/forum/index.php?/topic/16717/ -касательно примера оттуда.... при попытке изменить Ctrl+F5 на Alt+Q столкнулась с тем, что букву так просто не вопхнешь(((  ошибка на ошибке

да с F5 и цифрами код работает. а с буквами-нет(


(lily) #5

удалось таки открыть форму:)

driver.findElement(By.id("messageExt")).click(); // textbox в котором необходимо нажимать комбинацию
          Actions builder = new Actions(driver);
        builder.sendKeys(Keys.chord(Keys.CTRL,"l")).perform(); // вид комбинации

 

форма вызывается , но вот почему -то дальше в ней делать ничего не получается... тест падает, выдавая ошибку о "Element is not currently visible and so may not be interacted with", хотя элемент, который ищет есть и FireBug его находит..


(Alexander Petrovich) #6

Старницу бы... Очень тяжело что-то советовать, не видя как оно там всё работает


(lily) #7

промучавшись еще пару часов , форма не только запустилась, но и удалось некоторые действия произвести...

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

например xpath //form/div[6]/input[1] -для первого открытия формы

//form[1]/div[6]/input[1] при последующем открытии формы...

и тест валится т.к в коде записано без 1 , а в тесте, на момент выполнения уже локатор с 1.

 

код формы:

<div class="order-summary-form" style="position: absolute; cursor: default;">
    <div class="options-list-holder">
   <div class="loader"> </div>
  <div class="order-form-wrapper">
   <form id="order-summary-form-1" class="example-form order-summary-form-unique" method="post" action="http://" style="display: block;">
    <input type="hidden" value="" name="order_summary_id">
      <ul class="tabs">
   <input type="hidden" value="DefaultOptions" name="form-name">
      <div class="tab-holder">
       <div class="tab" rel="tab-1" style="display: block;">
       <div class="tab" rel="tab-2" style="display: none;">
         <div class="tab" rel="tab-3" style="display: none;">
        </div>
      <div class="area">
     <div class="area">
     <div class="area">
     <div style="clear: both;"></div>
     <div class="row-b">
       <input class="button" type="submit" value="Save">   -кнопка SAVE формы. на ней и падает все
        <input type="hidden" value="save-summary" name="action">
          <a class="btn-close" href="#">Close</a>
          <strong class="total">
          <br>
         <input type="hidden" name="paid_amount" value="0.00">
          <input type="hidden" name="coupon_type" value="0">
    </div>
<div class="markup-summary-holder options-popup-disabled">
<input class="hidden" type="radio" value="edit" name="type">
<input class="hidden" type="radio" value="replace" name="type">
</form>
</div>...

 


(Alexander Petrovich) #8

Что же вы, Ватсон!

//input[@value='Save']

Если локатор будет уникальным - пользуйтесь на здоровье.

 

ЗЫ Плохо пользоваться локаторами с индексом. Привязывайтесь к значениям атрибутов


(lily) #9

если б такой Save был один....

попробовала... все равно там же упало.

"Element is not currently visible and so may not be interacted with" ошибка в строке driver.findElement(By.xpath("//input[@value='Save']")).click();

 

 


(Alexander Petrovich) #10

В приведённом вами коде вижу только один. так то локатор должен не подкачать


(lily) #11

на странице есть еще 7 мест где value=Save. все 7 скрыты (в css прописаны как hidden) ))

 


(lily) #12

еще несколько часов борьбы и выяснилось следующее...

1) driver.findElement(By.xpath("//input[@value='Save']")).click(); так не желает искать. а вот с такой записью driver.findElement(By.xpath("//form/div[6]/input[1]")).click(); -как миленький.

2) после каждого алерта надо ставить ожидание .иначе просто "не успевает" сообразить ))

3) после отправки формы так же нужно ожидание... без ожидания форма создается ,но не отправляется.

ниже привела кусок тестового кода, который работает от момента нажатия Save. (сохраняется форма - отображается код формы. и отправка формы)

driver.findElement(By.xpath("//form/div[6]/input[1]")).click(); -                          Save
        driver.switchTo().alert().accept();
        driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);          два алерта
        driver.switchTo().alert().accept();
        driver.findElement(By.id("messageExt")).sendKeys("Hello");  
        driver.findElement(By.id("external-message-type-final")).click();
        driver.findElement(By.id("ext-message")).click();                                  отправка формы
        driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);

 

Возможно, есть варианты более красивой записи. тем более что //form/div[6] каждый раз при сохранении формы изменяет значение form на единицу: //form[1]/div[6] . но удалось запустить только такой вариант.

Комбинацию клавиш  TAB так же использую для того, что бы после открытия  формы перенести курсор на форму. ...

если есть идеи как улучшить - буду очень признательна!


(Alexander Petrovich) #13

Говорю же, не используйте индексы. Атрибуты!


(lily) #14

допустим в этой строчке:

             <a class="btn-close" href="#">Close</a>

- здесь атрибут у нас класс и href  , если я верно понимаю...

использовать их можно, но единоразово. т.к при создании следующей формы, у меня будет уже находить на странице не одну кнопку Close, а уже две и тест сыпется. ...


(Alexander Petrovich) #15

class, href и прочие и являются атрибутами
можно использовать локатор типа //a[@class='btn-close' and @href='#']
Если и этого мало, то и до самой ссылки тоже должны быть какие-то теги с уникальными атрибутами


(5am) #16

по поводу Save и "на странице есть еще 7 мест где value=Save. все 7 скрыты (в css прописаны как hidden) ))"

попробуйте как то так:

var webElements = WebDriver.FindElements(By.XPath(//input[@value='Save'])); //или //input[@class='button' and @value='Save']
if ((webElements == null) || (webElements.Count == 0))
{
    //some actions
}

foreach (var webElement in webElements)
{
    if ((webElement.Displayed) && (webElement.Enabled))
    {
        webElement.Click();

return;
    }
}

у меня в проекте поиск элемента вынесен в отдельный метод чего и вам советую, что то вроде такого:

http://pastebin.com/U0hVmKhk