Как выполнить функцию наведения мыши в Selenium WebDriver с использованием Java?

132

Я хочу использовать функцию наведения указателя мыши на раскрывающееся меню. Когда мы наводим курсор на меню, оно показывает новые параметры. Я попытался щелкнуть новые параметры с помощью xpath. Но нельзя щелкать меню напрямую. Итак, в качестве ручного способа я пытаюсь навести указатель мыши на раскрывающееся меню, а затем щелкнуть новые параметры.

Actions action = new Actions(webdriver);
WebElement we = webdriver.findElement(By.xpath("//html/body/div[13]/ul/li[4]/a"));
action.moveToElement(we).build().perform();
Прадип SJ
источник
Посетите этот сайт для получения подробного ответа - testautomationguru.com/…
vins

Ответы:

116

На самом деле невозможно выполнить действие «наведения мыши», вместо этого вам нужно связать все действия, которые вы хотите выполнить, за один раз. Итак, перейдите к элементу, который открывает другие, затем в той же цепочке перейдите к открытому элементу и щелкните по нему.

При использовании Action Chains вы должны помнить, что «делайте это как пользователь».

Actions action = new Actions(webdriver);
WebElement we = webdriver.findElement(By.xpath("html/body/div[13]/ul/li[4]/a"));
action.moveToElement(we).moveToElement(webdriver.findElement(By.xpath("/expression-here"))).click().build().perform();
Марк Роулэндс
источник
5
Для меня это не работает. Мое меню зависает только в том случае, если я выполняю build (). Perform () после moveToElement ()
GarfieldKlon
8
Причина, по которой это не совсем сработает, заключается в том, что все вызовы webdriver.findElement(By... something)выполняются раньше всего (это единственный способ передать их результат moveElement). В это время второй элемент, который вы хотите найти, еще не виден, потому что над первым все еще нужно навести курсор мыши. Чтобы исправить это, как вы сказали, вы можете вставить промежуточные .perform()s. Затем для второго findElementбудет изменено первое наведение perform. Данное решение может работать в зависимости от реализации страницы, но, видимо, ваш и мой опыт разнятся.
Сандер Верхаген
57

Ни один из этих ответов не работает, когда вы пытаетесь сделать следующее:

  1. Наведите курсор на пункт меню.
  2. Найдите скрытый элемент, который доступен ТОЛЬКО после наведения.
  3. Щелкните элемент подменю.

Если вы вставите команду «выполнить» после moveToElement, она переместится к элементу, и элемент подменю отобразится на короткое время, но это не наведение курсора. Скрытый элемент немедленно исчезает, прежде чем его можно будет найти, что приведет к исключению ElementNotFoundException. Я пробовал две вещи:

Actions builder = new Actions(driver);
builder.moveToElement(hoverElement).perform();
builder.moveToElement(clickElement).click().perform();

Это не сработало для меня. У меня сработало следующее:

Actions builder = new Actions(driver);
builder.moveToElement(hoverElement).perform();
By locator = By.id("clickElementID");
driver.click(locator);

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

zmorris
источник
3
Второй пример сработал и у меня при добавлении .perform ()
TheRed__
1
Не могу поверить, что это все еще проблема ... даже это не работает: builder.moveToElement (settings) .moveByOffset (0, 30) .moveToElement (stagingMenu) .pause (20000) .keyDown (Keys.CONTROL) .click (stagingMenu) .keyUp (Keys.CONTROL) .sendKeys (Keys.ENTER) .perform (); Я даже вижу, что запускается css на элементе в интервале тайм-аута. но ни один клик не срабатывает, что бы я ни пытался
Сангоку
Как бы вы поступили, если кликабельный элемент не является нормальным и имеет вид :: before . Это раньше становится видимым при наведении курсора мыши
Ашок Кумар Ганесан
25

Основываясь на этом сообщении в блоге, я смог запустить зависание, используя следующий код с Selenium 2 Webdriver:

String javaScript = "var evObj = document.createEvent('MouseEvents');" +
                    "evObj.initMouseEvent(\"mouseover\",true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);" +
                    "arguments[0].dispatchEvent(evObj);";


((JavascriptExecutor)driver).executeScript(javaScript, webElement);
Zugwalt
источник
2
Менее очевидное решение, но на 100% надежное для моего тестирования IE11. Если у вас проблемы с зависанием moveToElement, воспользуйтесь этим! Я кодирую на C #, так что это не только для Java.
vt100
Selenium Mouse Actions & Waits , Javascript initMouseEvent () Example
Яш,
Что это arguments[0]?
Ариан
@ArianHosseinzadeh это переданная в дом ссылка на второй переданный аргумент executeScript(), который являетсяwebElement
Zugwalt
Я получаю недостающую ссылку на исполнителя Javascript. Какие ссылки мне нужно добавить в C #
mark1234
11

Этот код отлично работает:

 Actions builder = new Actions(driver);
 WebElement element = driver.findElement(By.linkText("Put your text here"));
 builder.moveToElement(element).build().perform();

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


источник
Отлично просто нужно было добавитьusing OpenQA.Selenium.Interactions;
SushiGuy
7

Посмотрите на этот пример, как мы могли бы это реализовать.

введите описание изображения здесь

public class HoverableDropdownTest {

    private WebDriver driver;
    private Actions action;

    //Edit: there may have been a typo in the '- >' expression (I don't really want to add this comment but SO insist on ">6 chars edit"...
    Consumer < By > hover = (By by) -> {
        action.moveToElement(driver.findElement(by))
              .perform();
    };

    @Test
    public void hoverTest() {
        driver.get("https://www.bootply.com/render/6FC76YQ4Nh");

        hover.accept(By.linkText("Dropdown"));
        hover.accept(By.linkText("Dropdown Link 5"));
        hover.accept(By.linkText("Dropdown Submenu Link 5.4"));
        hover.accept(By.linkText("Dropdown Submenu Link 5.4.1"));
    }

    @BeforeTest
    public void setupDriver() {
        driver = new FirefoxDriver();
        action = new Actions(driver);
    }

    @AfterTest
    public void teardownDriver() {
        driver.quit();
    }

}

Подробный ответ можно найти здесь - http://www.testautomationguru.com/selenium-webdriver-automating-hoverable-multilevel-dropdowns/

Vins
источник
5

Я нашел этот вопрос в поисках способа сделать то же самое для моих тестов Javascript, используя Protractor (интерфейс javascript для Selenium).

Мое решение с транспортиром 1.2.0 и webdriver 2.1:

browser.actions()
.mouseMove(
  element(by.css('.material-dialog-container'))
)
.click()
.perform();

Это также принимает смещение (я использую его, чтобы щелкнуть сверху и слева от элемента :)

browser.actions()
.mouseMove(
  element(by.css('.material-dialog-container'))
  , -20, -20  // pixel offset from top left
)
.click()
.perform();
Платон
источник
4

Пример программы для наведения курсора мыши с использованием Selenium java WebDriver:

public class Mhover {
    public static void main(String[] args){
       WebDriver driver = new FirefoxDriver();
       driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
       driver.get("http://www.google.com");
       WebElement ele = driver.findElement(By.id("gbqfba"));
       Actions action = new Actions(driver);
       action.moveToElement(ele).build().perform();
    }
}
Рука помощи
источник
9
Пожалуйста, подумайте о том, чтобы включить некоторую информацию о своем ответе, а не просто размещать код. Мы стараемся не только «исправлять», но и помогать людям учиться. Вы должны объяснить, что было не так в исходном коде, что вы сделали иначе и почему ваши изменения сработали.
Эндрю Барбер
2
@AndrewBarber - Данная программа действительно может помочь пользователю. Эта программа работает правильно. Пользователь уже подтвердил это ..
Helping Hands
4
Я не спорю, это сработает ; Я говорю, что вы должны объяснить, почему это может сработать, почему то, что у них было, не работает и что вы изменили.
Эндрю Барбер
Этот код эквивалентен OP и не отвечает на вопрос. Без какой-либо контекстной информации это лишнее.
jpaugh
2

Можешь попробовать:

WebElement getmenu= driver.findElement(By.xpath("//*[@id='ui-id-2']/span[2]")); //xpath the parent

Actions act = new Actions(driver);
act.moveToElement(getmenu).perform();

Thread.sleep(3000);
WebElement clickElement= driver.findElement(By.linkText("Sofa L"));//xpath the child
act.moveToElement(clickElement).click().perform();

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

Прасетьо Буди
источник