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

Фотография

события мыши (mousemove, mouseover) в webdriver


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

#1 phunq

phunq

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

  • Members
  • Pip
  • 20 сообщений
  • ФИО:ВА

Отправлено 04 мая 2011 - 11:15

Извиняюсь если повтор, но поиск ничего пригодного не дал. Совсем недавно стали изучать selenium, сразу с версии 2.0 (с использованием webdriver).

Возник вопрос. Есть задача - нужно делать клик на элементе, который появляется после наведения мыши на другом элементе.
Соотвественно, стоит задача имитировать событие mouseover над этим элементом. Хотелось бы это реализовать используя вебдрайвер.

существует рабочий вариант с использованием WebDriverBackedSelenium:

Selenium selenium = new WebDriverBackedSelenium(wd, context.sUrl);
selenium.mouseOver("//div[@class='tabularReportPopupMenuDiv' and @_dde='1']");
selenium.mouseDown("css=div[class='tabularReportPopupMenuDivVisible']");

но мне кажется должен быть вариант без использования селениум 1.0.
Подскажите, пожалуйста, как реализуются такие вещи на webdriver.

Заранее, всем спасибо за участие.
  • 0

#2 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 04 мая 2011 - 11:20

Advanced User Interactions API
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#3 phunq

phunq

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

  • Members
  • Pip
  • 20 сообщений
  • ФИО:ВА

Отправлено 04 мая 2011 - 11:54

натыкался на эту статью - но тут не совсем понятно как это все реализуется.
упоминается интерфейс Mouse - но как он используется в ActionChainsGenerator мне осталось не ясно

если не сложно приведите пример в рамках основного вопроса.
  • 0

#4 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 04 мая 2011 - 12:17

ActionChainsGenerator builder = ((HasInputDevices) driver).actionsBuilder();



builder

    .moveToElement(driver.findElement(By.xpath("//div[@class='tabularReportPopupMenuDiv' and @_dde='1']")))

    .click(driver.findElement(By.cssSelector("div.tabularReportPopupMenuDivVisible")))

    .build()

    .perform;

  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#5 phunq

phunq

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

  • Members
  • Pip
  • 20 сообщений
  • ФИО:ВА

Отправлено 04 мая 2011 - 12:55

я использовал такой код - преобразовал из вашего. Если я правильно понимаю логику actiongenerator - строим действие, в конце вызываем build, затем perform, для его исполнения

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

	ActionChainsGenerator builder = ((HasInputDevices) wd).actionsBuilder();
	Action act = builder.moveToElement(wd.findElement(By.xpath("//div[@class='tabularReportPopupMenuDiv' and @_dde='1']"))).build();		
	act.perform();    
	builder.click(wd.findElement(By.cssSelector("div.tabularReportPopupMenuDivVisible"))).build().perform();


на строке:

        act.perform(); 

получаем UnsupportedOperationException
что я делаю не так?
  • 0

#6 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 04 мая 2011 - 13:14

Потому что рано Вы решили использовать Selenium 2 в промышленных проектах, не забывайте, что это ещё бета-версия -- Advanced User Interaction API реализован пока только в IE и HtmlUnit, а Вы, видимо, использовали какой-то другой браузер.
Можно, конечно, реализовать с использованием RenderedWebElement (как это было в оригинальном WebDriver, до слияния), но он deprecated, то есть когда Advanced User Interaction API будет реализован полностью, RenderedWebElement исчезнет (и это должно случиться до финального релиза), и Вам придется переписывать тесты.
Так что либо смиритесь с неудобствами использования бета-версии, либо пока продолжайте разрабатывать тесты на Selenium 1.0
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#7 phunq

phunq

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

  • Members
  • Pip
  • 20 сообщений
  • ФИО:ВА

Отправлено 04 мая 2011 - 13:44

Потому что рано Вы решили использовать Selenium 2 в промышленных проектах, не забывайте, что это ещё бета-версия -- Advanced User Interaction API реализован пока только в IE и HtmlUnit, а Вы, видимо, использовали какой-то другой браузер.
Можно, конечно, реализовать с использованием RenderedWebElement (как это было в оригинальном WebDriver, до слияния), но он deprecated, то есть когда Advanced User Interaction API будет реализован полностью, RenderedWebElement исчезнет (и это должно случиться до финального релиза), и Вам придется переписывать тесты.
Так что либо смиритесь с неудобствами использования бета-версии, либо пока продолжайте разрабатывать тесты на Selenium 1.0


Спасибо - все понятно. Как мне кажется, я могу использовать комбинированный подход для написания тестов, т.е. на ряду с использованием второй версии так же применять куски кода с использованием WebDriverBackedSelenium. Ибо объектная модель, реализуемая во второй версии выглядит более интересной и гибкой.

PS - запускал под firefox
  • 0

#8 Dary

Dary

    Активный участник

  • Members
  • PipPip
  • 94 сообщений
  • ФИО:даша

Отправлено 07 октября 2011 - 12:29

так всё-таки, как же реализовать метод mouseOver?

Я нашла вот такой вариант:
public void mouseOver(String element){
	//build and perform the mouseOver with Advanced User Interactions API
	Actions builder = new Actions(driver);    
	builder.moveToElement(getElement(element)).build().perform();
}

он действительно наводит мышь на элемент, но тут же уводит его.
А мне надо, чтобы на нём и остался пока не будет выполнена команда mouseOut
  • 0

#9 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 11 октября 2011 - 12:46

А что Вы собираетесь делать в то время, пока курсор наведён на элемент?
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#10 Dary

Dary

    Активный участник

  • Members
  • PipPip
  • 94 сообщений
  • ФИО:даша

Отправлено 26 октября 2011 - 10:19

А что Вы собираетесь делать в то время, пока курсор наведён на элемент?


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

#11 baieritrin

baieritrin

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

  • Members
  • Pip
  • 6 сообщений
  • ФИО:Лежалкин Руслан


Отправлено 27 октября 2011 - 08:21

Столкнулся с той же проблемой. Посоветуйте рабочее решение.
(WebDriver + C#, IE)
на сайте есть меню, оно раскрывается с некоторой задержкой
и, если курсор находится НЕ на пункте основного меню, то меню быстро пропадает и кликнуть на пункт невозможно - элемент по локатору уже не найден.
для прохождения теста убираю курсор в верхний левый угол средствами АвтоИт (которую я удачно прикрутил к проекту). Но такое решение не всегда успешно, меню часто пропадает.

идеальный вариант: подводить курсор к пункту меню, нажимать пункт, затем в раскрывшемся списке подводить курсор к нужному подпункту, нажимать подпункт.

попытки перевода на C# попадающихся решений на Java, если и доходили до успешной компиляции, то вызывали исключения в процессе вызова.
следующий код не двигает мышку, а попытки самостоятельно разобраться с IMouse и ещё более непонятным параметром ICoordinates вообще завели в тупик.

Actions builder = new Actions(_driver);
builder.MoveToElement(_driver.FindElement(By.Id(Locators.SubMenu_CardPSDId))).Build().Perform();

было ещё одно решение через поле элемента Location + перемещение в АвтоИт, но это Location оказалось координаты относительные, вопрос относительно чего. АвтоИт MouseMove перемещает курсор в координаты относительно экрана.
//static AutoItX3Lib.IAutoItX3 au3 = new AutoItX3Lib.AutoItX3();
IWebElement el = _driver.FindElement(By.Id(Locators.SubMenu_CardPSDId));
au3.MouseMove(el.Location.X, el.Location.Y, 5);
  • 0

#12 phuzzico

phuzzico

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

  • Members
  • Pip
  • 2 сообщений
  • ФИО:Кириченко Анна
  • Город:Харьков

Отправлено 05 января 2012 - 09:28

baieritrin, вы нашли решение проблемы? у меня такой же environment, варианты из данного топика ничего путного не дали - ни MouseMove, ни MoveToElement.
Была мысль насчет focus, но он, кажется, работает только в PC.
Селениумом занимаюсь месяца полтора, так что буду рада более-менее четкому обьяснению :)
Заранее спасибо!
  • 0

#13 egorza

egorza

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

  • Members
  • Pip
  • 26 сообщений
  • ФИО:Замараев Егор


Отправлено 21 января 2012 - 09:49

Алексей Баранцев в одной из тем показывал как замедлять события=) В опере все заработало. Я так понимаю можно именно для отдельных событий использовать wait. Но IE все равно проигнорировал ожидание и убрал в угол курсор, закрыв меню. А фаерфокс даже не нажал на ок в строчке driver.findElement(By.className("button_standard")).click();. Пробовал через Xpath и через className. Везде работает, в фаерфоксе - нет.

package Testpack;

import static org.junit.Assert.*;

import java.util.concurrent.TimeUnit;

import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.events.EventFiringWebDriver;
import org.testng.annotations.BeforeTest;

import com.opera.core.systems.OperaDriver;

public class LoginLogoutTest {
	
	public static void main(String[] args) throws InterruptedException {
		EventFiringWebDriver driver = new EventFiringWebDriver(new OperaDriver());
		driver.register(new ListenerThatWaitsBeforeAnyAction(3, TimeUnit.SECONDS));

        driver.navigate().to("http://xxx.ru");
		driver.findElement(By.id("UserName")).clear();
		driver.findElement(By.id("UserName")).sendKeys("xxx");
		driver.findElement(By.id("Password")).clear();
		driver.findElement(By.id("Password")).sendKeys("xxx");
		
		driver.findElement(By.className("button_standard")).click();
		
		 Actions builder = new Actions(driver);    
	        builder.moveToElement(driver.findElement(By.xpath("//li[contains(@class, 't-item mainmenuico_learning_head')]"))).build().perform();
	    
	    
	         driver.findElement(By.xpath("//a[@class='t-link' and contains(@href, 'Learning/StudentCourses')]")).click();
	     
	}
	
}

и сам класс ListenerThatWaitsBeforeAnyAction

package Testpack;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.events.AbstractWebDriverEventListener;


public class ListenerThatWaitsBeforeAnyAction extends AbstractWebDriverEventListener {
	
	private final long timeout;

	public ListenerThatWaitsBeforeAnyAction(long timeout, TimeUnit unit) {
		this.timeout = TimeUnit.MILLISECONDS.convert(Math.max(0, timeout), unit);
	}

	@Override
	public void beforeNavigateTo(String url, WebDriver driver) {
		sleep();
	}

	@Override
	public void beforeNavigateBack(WebDriver driver) {
		sleep();
	}

	@Override
	public void beforeNavigateForward(WebDriver driver) {
		sleep();
	}

	@Override
	public void beforeClickOn(WebElement element, WebDriver driver) {
		sleep();
	}

	@Override
	public void beforeChangeValueOf(WebElement element, WebDriver driver) {
		sleep();
	}

	@Override
	public void beforeScript(String script, WebDriver driver) {
		sleep();
	}

	private void sleep() {
		try {
			Thread.sleep(timeout);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

}


  • 0

#14 baieritrin

baieritrin

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

  • Members
  • Pip
  • 6 сообщений
  • ФИО:Лежалкин Руслан


Отправлено 27 февраля 2012 - 10:30

нет, решение так и не найдено, а реализация заменена на прямые ссылки на страницы.
проверка меню выведена в отдельный тест. (не приоритетное, руками)
  • 0

#15 Sarge

Sarge

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

  • Members
  • Pip
  • 2 сообщений

Отправлено 06 марта 2012 - 11:41

так всё-таки, как же реализовать метод mouseOver?

Я нашла вот такой вариант:

public void mouseOver(String element){
	//build and perform the mouseOver with Advanced User Interactions API
	Actions builder = new Actions(driver);    
	builder.moveToElement(getElement(element)).build().perform();
}

он действительно наводит мышь на элемент, но тут же уводит его.
А мне надо, чтобы на нём и остался пока не будет выполнена команда mouseOut

попробуй сделать функцию mouseOverWait , в которой будут функция mouseOver, циклы for и if для определения успешного дейтвия , а так же Thread.sleep(ms) (задержка)
  • 0

#16 simeon

simeon

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

  • Members
  • Pip
  • 9 сообщений

Отправлено 13 марта 2012 - 12:48

А почему не хотите реализовать с помощью js?

((IJavaScriptExecutor)WebDriver).ExecuteScript("var evt = document.createEvent('MouseEvents');" +
"evt.initMouseEvent('mouseover',true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);" +
"arguments[0].dispatchEvent(evt);", WebDriver.FindWebElement(By.Id('asdf')));
  • 0

#17 ArSad

ArSad

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

  • Members
  • Pip
  • 1 сообщений
  • ФИО:Садовский Александр

Отправлено 26 июля 2012 - 10:32

Была аналогичная ситуация.
Очень помог код вида:


driver.findElement(By.id("Password")).Click(); // Ищем нормальный элемент
driver.SwitchTo().ActiveElement().sendKeys(OpenQA.Selenium.Keys.Tab); // Переходим табом на проблемный элемент
driver.SwitchTo().ActiveElement().Click(); // И кликаем на активном проблемном :)
  • 0

#18 owasp

owasp

    Активный участник

  • Members
  • PipPip
  • 87 сообщений

Отправлено 04 марта 2013 - 15:43

MouseMove сделал через метод расширения для IWebElement (реализация C# для Selenium.WebDriver.dotnet40.2.31.1.0) см. метод MouseMove:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using OpenQA.Selenium;
using OpenQA.Selenium.Remote;

namespace NpoComputer.SeleniumHelper.Extensions
{
    public static class WebElementExtension
    {
        /// <summary>
        /// Поиск элемента с дополнительным Linq-фильтром
        /// </summary>
        /// <param name="driver"></param>
        /// <param name="by">Условие выборки списка элементов</param>
        /// <param name="predicate">Linq-фильтр</param>
        /// <returns>Первый элемент в результатах поиска с фильтрацией (если элемент существует)</returns>
        public static IWebElement FindElement(this IWebDriver driver, By by, Func<IWebElement, bool> predicate)
        {
            return driver.FindElements(by, predicate).First();
        }

        /// <summary>
        /// Получение списка классов элемента
        /// </summary>
        /// <param name="element"></param>
        /// <returns>Список классов</returns>
        public static ReadOnlyCollection<string> ClassList(this IWebElement element)
        {
            ReadOnlyCollection<string> classList;
            try
            {
                char[] arraySeparators = { ' ', '\n', '\t' };
                classList = element
                    .GetAttribute("class")
                    .Split(arraySeparators, StringSplitOptions.RemoveEmptyEntries)
                    .ToReadOnlyCollection<string>();
            }
            catch(Exception)
            {
                classList = new ReadOnlyCollection<string>(new List<string>());
            }
            return classList;
        }

        public static void MouseMove(this IWebElement element)
        {
            RemoteWebElement webElement = element as RemoteWebElement;
            RemoteWebDriver webDriver = webElement.WrappedDriver as RemoteWebDriver;
            webDriver.Mouse.MouseMove(webElement.Coordinates);
        }

        public static void ContextClick(this IWebElement element)
        {
            RemoteWebElement webElement = element as RemoteWebElement;
            RemoteWebDriver webDriver = webElement.WrappedDriver as RemoteWebDriver;
            webDriver.Mouse.ContextClick(webElement.Coordinates);
        }
    }
}

Вызов MouseMove для определённго элемента, реализующего IWebElement:
element.MouseMove(); //где element - объект IWebElement)
  • 0

#19 Qasl

Qasl

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

  • Members
  • Pip
  • 15 сообщений

Отправлено 10 июня 2014 - 11:46

Прошу помощи.

Задача: нажать на элемент в меню,которое появляется только после наведения курсора на боковую панель.

public void minikotik() {
        Actions builder = new Actions(driver);
        builder.moveToElement(
                driver.findElement(By
                        .xpath("//div[@class='jw-TitleRoundPanel jw-TitleRoundPanel-round-left']")))
                .build().perform();

        driver.findElement(By.xpath("//*[text()='Координация']")).click();
    }

Он наводит,меню выпадает,но нажать он не успевает и уводит курсор как будто в сторону.Добавили как писали выше класс ListenerThatWaitsBeforeAnyAction.

Частично помогло,сначало он исправно нажимал,а потом в один прекрастный момент перестал,как бы не экспериментировали со временем ничего не выходит.Меню то выдвигается,то задвигается обратно несколько раз.

 

Может можно как то после наведения курсора заставить его удерживать текущую позицию и не двигаться?


  • 0

#20 BabyRoot

BabyRoot

    Специалист

  • Members
  • PipPipPipPipPip
  • 833 сообщений


Отправлено 10 июня 2014 - 12:08

А вы всё в один билдер запихните, он на то и нужен чтобы цепочку действий воспроизводить (мув-клик-перформ).


  • 1


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

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