จะใช้ฟังก์ชัน mouseover ใน 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
สำหรับฉันมันไม่ได้ผล เมนูของฉันจะถูกเลื่อนเฉพาะเมื่อฉันทำการสร้าง () ดำเนินการ () หลังจาก moveToElement ()
GarfieldKlon

8
เหตุผลที่สิ่งนี้ใช้ไม่ได้ผลคือการเรียกทั้งหมดwebdriver.findElement(By... something)จะดำเนินการก่อนสิ่งอื่นใด (นั่นเป็นวิธีเดียวที่จะส่งต่อผลลัพธ์ไปให้moveElement) ในเวลานั้นองค์ประกอบที่สองที่คุณต้องการค้นหายังไม่ปรากฏให้เห็นเนื่องจากองค์ประกอบแรกยังคงต้องวางเมาส์เหนือ ในการแก้ไขดังที่คุณกล่าวคุณสามารถแทรก.perform()s กลางจากนั้นสำหรับครั้งที่สองfindElementโฮเวอร์แรกจะได้รับการperformแก้ไข วิธีแก้ปัญหาที่ระบุอาจใช้งานได้ขึ้นอยู่กับการใช้งานเพจ แต่เห็นได้ชัดว่าไมล์สะสมของคุณและของฉันแตกต่างกันไป
Sander Verhagen

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
ตัวอย่างที่สองก็ใช้ได้ผลเช่นกันเมื่อเพิ่ม. superform ()
TheRed__

1
ไม่สามารถเชื่อว่าสิ่งนี้ยังคงเป็นปัญหา ... แม้จะใช้งานไม่ได้: builder.moveToElement (การตั้งค่า) .moveByOffset (0, 30) .moveToElement (stagingMenu) .pause (20000) .keyDown (Keys.CONTROL) .click (stagingMenu) .keyUp (Keys.CONTROL) .sendKeys (Keys.ENTER) .perform (); ฉันยังเห็นโฮเวอร์ css ทริกเกอร์บนองค์ประกอบในช่วงหมดเวลา แต่ไม่มีการคลิกเกิดขึ้นไม่ว่าฉันจะลองอะไรก็ตาม
Sangoku

วิธีที่คุณจะจัดการถ้าคลิกได้ที่ไม่ได้เป็นองค์ประกอบปกติและมันมาเหมือน:: ก่อน ก่อนหน้านี้จะปรากฏให้เห็นเมื่อคุณวางเมาส์
Ashok kumar Ganesan

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

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

นี่มันอะไรกันarguments[0]?
Arian

@ArianHosseinzadeh ส่งผ่านใน Dom อ้างอิงถึงอาร์กิวเมนต์ที่สองที่ส่งไปexecuteScript()ซึ่งคือ awebElement
Zugwalt

ฉันได้รับ missign ref สำหรับโปรแกรมดำเนินการ 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 (ส่วนหน้าของจาวาสคริปต์ไปยังซีลีเนียม)

วิธีแก้ปัญหาของฉันด้วยไม้โปรแทรกเตอร์ 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
โปรดพิจารณารวมข้อมูลบางอย่างเกี่ยวกับคำตอบของคุณแทนที่จะโพสต์รหัส เราพยายามให้ไม่ใช่แค่ 'การแก้ไข' แต่ช่วยให้ผู้คนเรียนรู้ คุณควรอธิบายสิ่งที่ผิดพลาดในรหัสเดิมสิ่งที่คุณทำแตกต่างออกไปและเหตุใดการเปลี่ยนแปลงของคุณจึงได้ผล
Andrew Barber

2
@AndrewBarber - โปรแกรมที่กำหนดสามารถช่วยผู้ใช้งานได้มาก โปรแกรมนั้นทำงานได้ดี ผู้ใช้ยอมรับแล้วว่า ..
มือช่วย

4
ผมไม่โต้แย้งก็จะทำงาน ; ฉันกำลังบอกว่าคุณควรอธิบายว่าทำไมมันถึงใช้งานได้ทำไมสิ่งที่พวกเขามีไม่ได้ผลและสิ่งที่คุณเปลี่ยนไป
Andrew Barber

รหัสนี้เทียบเท่ากับ 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();

หากคุณมีกรณีที่เว็บมีหลายหมวดหมู่ให้ใช้วิธีแรก สำหรับเมนูที่คุณต้องการคุณต้องใช้วิธีที่สอง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.