t.me/atinfo_chat Telegram группа по автоматизации тестирования

Работа со скрывающейся формой.


(Kostuan) #1

Есть выпадающая форма с выбором статусов. После клика что бы форма открылась если в этой форме нету курсора она срывается через пару секунд. Селениум почемуто не может выбрать статус. Как можно заставить селениум перевести курсор в эту форму?


(Alexander Petrovich) #2

Вчера как раз столкнулся с такой проблемой

На питоне примерно так

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

webdriver
= webdriver.Firefox()
webdriver.
get('http://some_url')
element_to_hover_over
= firefox.find_element_by_id("id")

hover
= ActionChains(driver).move_to_element(element_to_hover_over)
hover
.perform()

В конце обязательно добавляем  hover.perform(), или эффекта не получим


(Kostuan) #3

Спасибо на руби выглядит так

status1 = driver.find_element(:css, "..............")

driver.action.move_to(status1).click.perform


(PaJah) #4

Подскажите, пожалуйста, решение.

У меня похожая форма, открывающаяся при наведении курсора мыши на элемент. Однако, 

element_to_hover_over = firefox.find_element_by_id("id")

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

Вцелом вопрос такой: как реализовать не просто наведение, а наведение и удержание курсора на элементе?
Спасибо!

 


(Taras) #5
Вот такие конструкции разние можна юзать:
 
Actions a = new Actions(driver);
a.build();
a.moveToElement().clickAndHold().moveByOffset().release();  //параметри только передать правильние нужно
a.perform(); 
 
Удерживать можна, перемещать итд.

(PaJah) #6

натыкался на такую конструкцию много раз, когда искал в интернете.
кто-нибудь может подсказать, как это реализовать на Python?


(PaJah) #7

натыкался на такую конструкцию много раз, когда искал в интернете.
кто-нибудь может подсказать, как это реализовать на Python?


(Taras) #8

на Java есть у меня работающее варианты, питон увы не знаю)

сдесь есть парни по Питну специ, может отпишуться) ждите


(Mykhailo Poliarush) #9

какой код надо написать на python?


(Mykhailo Poliarush) #10

впрочем логика довольно просто и очень похожа на java

нужно использовать selenium.webdriver.common.action_chains.ActionChains

например

 

    def testDoubleClick(self):
        toDoubleClick = self.driver.find_element_by_id("doubleClickField")
        dblClick = ActionChains(self.driver).double_click(toDoubleClick)
        dblClick.perform()
        self.assertEqual("DoubleClicked", toDoubleClick.get_attribute('value'))

(Taras) #11

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


(PaJah) #12

Отпишусь по результатам эксперементов :)


(PaJah) #13
  def testDoubleClick(self):
        toDoubleClick = self.driver.find_element_by_id("doubleClickField")
        dblClick = ActionChains(self.driver).double_click(toDoubleClick)
        dblClick.perform()
        self.assertEqual("DoubleClicked", toDoubleClick.get_attribute('value'))

 

а что если между

dblClick = ActionChains(self.driver).double_click(toDoubleClick)

и

dblClick.perform()

нужно определить еще один элемент типа "find_element_by_"?
только в моем случае это не дабл клик, а move_to_element, и всплывающая форма, появляющаяся после наведения на первый элемент, пропадает при определении нового элемента :(


(Mykhailo Poliarush) #14

вот еще один пример, я думаю, тут станет полностью понятно

    def performDragAndDropWithMouse(self):
        dragReporter self.driver.find_element_by_id("dragging_reports")
        toDrag self.driver.find_element_by_id("rightitem-3")
        dragInto self.driver.find_element_by_id("sortable1")

        holdItem ActionChains(self.driver).click_and_hold(toDrag)
        moveToSpecificItem ActionChains(self.driver\
            .move_to_element(self.driver.find_element_by_id("leftitem-4"))
        moveToOtherList ActionChains(self.driver).move_to_element(dragInto)
        drop ActionChains(self.driver).release(dragInto)
        self.assertEqual("Nothing happened."dragReporter.text)

        holdItem.perform()
        moveToSpecificItem.perform()
        moveToOtherList.perform()
        self.assertEqual("Nothing happened. DragOut"dragReporter.text)

        drop.perform()


(vitaly.gorbenko) #15

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

 

public void clickSubMenu(WebElement element, final By locator){
//двигаем mouse на элемент, при наведении на который выпадает скрытый список
   Locatable hoverItem = (Locatable) element;
   Mouse mouse = ((HasInputDevices) driver).getMouse();
   mouse.mouseMove(hoverItem.getCoordinates());
//пришлось добавить серию перемещений mouse в пределах выпавшего списка чтобы скрытый элемент списка можно было найти в DOM
   mouse.mouseMove(hoverItem.getCoordinates(),5,15);
   mouse.mouseMove(hoverItem.getCoordinates(),1,1);
   mouse.mouseMove(hoverItem.getCoordinates(),5,15);
   mouse.mouseMove(hoverItem.getCoordinates(),1,1);
//теперь находим элемент списка, который нам нужно кликнуть
   Locatable actionItem = (Locatable) driver.findElement(locator);
   mouse.mouseMove(actionItem.getCoordinates());
//кликаем
   mouse.click(null);
}
Все попытки использовать Action и Builder  не увенчались успехом, элемент чаще всего не находился, лишь изредка тест завершался успешно. Завтра буду это гонять в связке с другим функциналом, вдруг чот новое обраружится - отпишусь.