Как выполнить функцию наведения мыши в 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();

Посетите этот сайт для получения подробного ответа - 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, я мог навести курсор и затем щелкнуть.


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);

2
Менее очевидное решение, но на 100% надежное для моего тестирования IE11. Если у вас проблемы с зависанием moveToElement, воспользуйтесь этим! Я кодирую на C #, так что это не только для Java.
vt100


Что это 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/


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();

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.