
события мыши (mousemove, mouseover) в webdriver
#1
Отправлено 04 мая 2011 - 11:15
Возник вопрос. Есть задача - нужно делать клик на элементе, который появляется после наведения мыши на другом элементе.
Соотвественно, стоит задача имитировать событие 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.
Заранее, всем спасибо за участие.
#2
Отправлено 04 мая 2011 - 11:20
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium
#3
Отправлено 04 мая 2011 - 11:54
упоминается интерфейс Mouse - но как он используется в ActionChainsGenerator мне осталось не ясно
если не сложно приведите пример в рамках основного вопроса.
#4
Отправлено 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;
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium
#5
Отправлено 04 мая 2011 - 12:55
Внес изменения потому, что элемента 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
что я делаю не так?
#6
Отправлено 04 мая 2011 - 13:14
Можно, конечно, реализовать с использованием RenderedWebElement (как это было в оригинальном WebDriver, до слияния), но он deprecated, то есть когда Advanced User Interaction API будет реализован полностью, RenderedWebElement исчезнет (и это должно случиться до финального релиза), и Вам придется переписывать тесты.
Так что либо смиритесь с неудобствами использования бета-версии, либо пока продолжайте разрабатывать тесты на Selenium 1.0
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium
#7
Отправлено 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
#8
Отправлено 07 октября 2011 - 12:29
Я нашла вот такой вариант:
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
#9
Отправлено 11 октября 2011 - 12:46
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium
#10
Отправлено 26 октября 2011 - 10:19
А что Вы собираетесь делать в то время, пока курсор наведён на элемент?
буду выполнять проверку наличия появившихся элементов, а появляются они с некоторой задержкой..
#11
Отправлено 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);
#12
Отправлено 05 января 2012 - 09:28
Была мысль насчет focus, но он, кажется, работает только в PC.
Селениумом занимаюсь месяца полтора, так что буду рада более-менее четкому обьяснению :)
Заранее спасибо!
#13
Отправлено 21 января 2012 - 09:49
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(); } } }
#14
Отправлено 27 февраля 2012 - 10:30
проверка меню выведена в отдельный тест. (не приоритетное, руками)
#15
Отправлено 06 марта 2012 - 11:41
попробуй сделать функцию mouseOverWait , в которой будут функция mouseOver, циклы for и if для определения успешного дейтвия , а так же Thread.sleep(ms) (задержка)так всё-таки, как же реализовать метод 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
#16
Отправлено 13 марта 2012 - 12:48
((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')));
#17
Отправлено 26 июля 2012 - 10:32
Очень помог код вида:
driver.findElement(By.id("Password")).Click(); // Ищем нормальный элемент
driver.SwitchTo().ActiveElement().sendKeys(OpenQA.Selenium.Keys.Tab); // Переходим табом на проблемный элемент
driver.SwitchTo().ActiveElement().Click(); // И кликаем на активном проблемном :)
#18
Отправлено 04 марта 2013 - 15:43
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)
#19
Отправлено 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.
Частично помогло,сначало он исправно нажимал,а потом в один прекрастный момент перестал,как бы не экспериментировали со временем ничего не выходит.Меню то выдвигается,то задвигается обратно несколько раз.
Может можно как то после наведения курсора заставить его удерживать текущую позицию и не двигаться?
#20
Отправлено 10 июня 2014 - 12:08
А вы всё в один билдер запихните, он на то и нужен чтобы цепочку действий воспроизводить (мув-клик-перформ).
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных