Як виконати функцію миші в 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

Насправді неможливо виконати дію «наведення миші», натомість потрібно зав'язати всі дії, які ви хочете досягти за один раз. Тож перейдіть до елемента, який розкриває інші, потім під час цього ж ланцюга перейдіть до тепер відкритого елемента та натисніть на нього.

Використовуючи ланцюги дій, ви повинні пам’ятати, що «зробіть це так, як це робив би користувач».

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
Для мене це не працює. Моє меню зависає лише в тому випадку, якщо я виконую збірку (). Виконайте () після переміщенняToElement ()
GarfieldKlon

8
Причина цього не дуже спрацює в тому, що всі дзвінки webdriver.findElement(By... something)виконуються раніше, ніж будь-що інше (це єдиний спосіб передачі їх результату moveElement). На той час другий елемент, який ви хочете знайти, ще не видно, оскільки перший ще має бути накладений на нього. Щоб виправити це, як ви вже говорили, ви можете вставити проміжні .perform()s, Тоді для другого findElementперший вказівник буде performзмінено. Дане рішення може працювати, залежно від реалізації сторінки, але, очевидно, ваш і мій пробіг варіювали.
Сандер Верхаген

57

Жоден із цих відповідей не спрацьовує:

  1. Наведіть курсор на пункт меню.
  2. Знайдіть прихований елемент, який ТІЛЬКИ доступний після наведення курсору.
  3. Клацніть пункт підменю.

Якщо після переміщенняToElement вставити команду "виконувати", вона переміщується до елемента, і пункт підменю відображається на короткий період, але це не наведення курсора. Прихований елемент негайно зникає, перш ніж його можна знайти, в результаті чого з'явиться елемент 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 (налаштування) .moveByOffset (0, 30) .moveToElement (stagingMenu) .пауза (20000) .keyDown (Keys.CONTROL) .click (stagingMenu) .keyUp (Keys.CONTROL) .sendKeys (Keys.ENTER) .perform (); Я навіть бачу css-курсор, що запускається на елементі в проміжок часу. але жодне натискання не спрацьовує, що б я не намагався
Сангоку

Як би ви впоралися, якщо натискання не є нормальним елементом, і воно виглядає як : раніше . Це раніше стає помітним при наведенні миші
Ашок кумар Ганесан

25

На основі цієї публікації в блозі я зміг запустити наведення курсора за допомогою наступного коду за допомогою Webdriver Selenium 2:

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
Зугвальт

Я отримую місію про оформлення виконавця 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 - Дана програма дійсно може допомогти користувачеві. Ця програма працює належним чином. Користувач це вже прийняв ..
Допомагаючи рукам

4
Я не заперечую, що це спрацює ; Я кажу, що ви повинні пояснити, чому це може працювати, чому те, що вони мали, не працює, і що ви змінили.
Ендрю Барбер

Цей код еквівалентний ОП і не відповідає на питання. Без будь-якої контекстуальної інформації вона зайва.
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.