Bagaimana cara menjalankan fungsi mouseover di Selenium WebDriver menggunakan Java?


132

Saya ingin melakukan fungsi mouseover pada menu drop down. Ketika kita mengarahkan kursor ke menu, itu akan menampilkan opsi baru. Saya mencoba mengklik opsi baru menggunakan xpath. Tetapi tidak dapat mengklik menu secara langsung. Jadi, sebagai cara manual saya mencoba untuk mengarahkan kursor ke menu drop down dan kemudian akan mengklik opsi baru.

Actions action = new Actions(webdriver);
WebElement we = webdriver.findElement(By.xpath("//html/body/div[13]/ul/li[4]/a"));
action.moveToElement(we).build().perform();

Periksa situs ini untuk jawaban terperinci - testautomationguru.com/...
vins

Jawaban:


116

Ini tidak benar-benar mungkin untuk melakukan tindakan 'mouse hover', sebagai gantinya Anda perlu membuat rantai semua tindakan yang ingin Anda capai dalam sekali jalan. Jadi pindah ke elemen yang mengungkapkan yang lain, lalu selama rantai yang sama, pindah ke elemen yang sekarang terungkap dan klik di atasnya.

Saat menggunakan Action Chains, Anda harus ingat untuk 'melakukannya seperti yang dilakukan pengguna'.

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
Bagi saya ini tidak berhasil. Menu saya hanya akan melayang jika saya melakukan build (). Perform () setelah moveToElement ()
GarfieldKlon

8
Alasan bahwa ini tidak akan berhasil adalah karena semua panggilan webdriver.findElement(By... something)dieksekusi sebelum hal lain (itulah satu-satunya cara hasil mereka dapat diteruskan ke moveElement). Pada saat itu elemen kedua yang ingin Anda temukan belum terlihat karena yang pertama masih harus di-hover. Untuk memperbaikinya, seperti yang Anda katakan, Anda dapat menyisipkan perantara .perform(), Kemudian untuk yang kedua findElement, kursor pertama akan performdiedit. Solusi yang diberikan mungkin bekerja, tergantung pada implementasi halaman, tetapi ternyata jarak tempuh Anda dan saya berbeda-beda.
Sander Verhagen

57

Tidak satu pun dari jawaban ini yang berfungsi ketika mencoba melakukan hal berikut:

  1. Arahkan kursor ke item menu.
  2. Temukan elemen tersembunyi yang HANYA tersedia setelah hover.
  3. Klik item sub-menu.

Jika Anda memasukkan perintah 'perform' setelah moveToElement, itu akan pindah ke elemen, dan item sub-menu menunjukkan untuk periode singkat, tetapi itu bukan hover. Elemen tersembunyi segera menghilang sebelum dapat ditemukan menghasilkan ElementNotFoundException. Saya mencoba dua hal:

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

Ini tidak berhasil untuk saya. Berikut ini bekerja untuk saya:

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

Menggunakan Tindakan untuk mengarahkan kursor dan klik WebDriver standar, saya bisa mengarahkan lalu klik.


3
Contoh kedua bekerja untuk saya juga ketika menambahkan .perform ()
TheRed__

1
Tidak dapat percaya ini masih merupakan masalah ... bahkan ini tidak berfungsi: builder.moveToElement (pengaturan) .moveByOffset (0, 30) .moveToElement (stagingMenu) .pause (20000) .keyDown (Keys.CONTROL) .klik (stagingMenu) .keyUp (Keys.CONTROL) .sendKeys (Keys.ENTER) .perform (); Aku bahkan melihat triggerd hover css pada elemen dalam rentang waktu. tapi tidak ada klik yang menjadi triggerd apa pun yang saya coba
Sangoku

Bagaimana Anda menangani jika dapat diklik bukan elemen normal dan itu datang seperti :: sebelumnya . Ini sebelumnya terlihat ketika Anda mengarahkan mouse
Ashok kumar Ganesan

25

Berdasarkan posting blog ini saya dapat memicu melayang menggunakan kode berikut dengan 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
Solusi yang kurang jelas, tetapi 100% solid untuk pengujian IE11 saya. Jika Anda memiliki masalah melayang moveToElement, gunakan yang ini! Saya kode dalam C #, jadi tidak hanya cara Jawa untuk melakukannya.
vt100

Selenium mouse Actions & Waits , Javascript initMouseEvent () Example
Yash

Apa ini arguments[0]?
Arian

@ArianHosseinzadeh dengan referensi dom yang disahkan pada argumen kedua yang diteruskan executeScript(), yaituwebElement
Zugwalt

Saya mendapatkan referensi missign untuk pelaksana Javascript. Referensi apa yang perlu saya tambahkan di C #
mark1234

11

Kode ini berfungsi dengan baik:

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

Setelah mouse berakhir, Anda dapat melanjutkan untuk melakukan tindakan selanjutnya yang Anda inginkan pada informasi yang diungkapkan


Excellent baru saja menambahkanusing OpenQA.Selenium.Interactions;
SushiGuy

7

Lihat contoh ini bagaimana kita bisa menerapkan ini.

masukkan deskripsi gambar di sini

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

}

Untuk jawaban terperinci, periksa di sini - http://www.testautomationguru.com/selenium-webdriver-automating-hoverable-multilevel-dropdowns/


5

Saya menemukan pertanyaan ini mencari cara untuk melakukan hal yang sama untuk tes Javascript saya, menggunakan busur derajat (antarmuka javascript ke Selenium.)

Solusi saya dengan busur derajat 1.2.0 dan webdriver 2.1:

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

Ini juga menerima offset (saya menggunakannya untuk mengklik di atas dan di kiri elemen :)

browser.actions()
.mouseMove(
  element(by.css('.material-dialog-container'))
  , -20, -20  // pixel offset from top left
)
.click()
.perform();

4

Contoh program untuk mengarahkan mouse menggunakan 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
Harap pertimbangkan untuk memasukkan beberapa informasi tentang jawaban Anda, daripada sekadar memposting kode. Kami mencoba memberikan tidak hanya 'perbaikan', tetapi membantu orang belajar. Anda harus menjelaskan apa yang salah dalam kode asli, apa yang Anda lakukan secara berbeda, dan mengapa perubahan Anda berhasil.
Andrew Barber

2
@AndrewBarber - Program yang diberikan benar-benar dapat membantu pengguna. Program itu berfungsi dengan baik. Pengguna telah menerima itu ..
Helping Hands

4
Saya tidak membantah ini akan berhasil ; Saya mengatakan bahwa Anda harus menjelaskan mengapa itu bisa berhasil, mengapa apa yang mereka miliki tidak berhasil, dan apa yang Anda ubah.
Andrew Barber

Kode ini setara dengan OP dan tidak menjawab pertanyaan. Tanpa informasi kontekstual, itu berlebihan.
jpaugh

2

Anda dapat mencoba:

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

Jika Anda memiliki case web memiliki banyak kategori, gunakan metode pertama. Untuk menu yang Anda inginkan, Anda hanya perlu metode kedua.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.