Làm cách nào để thực hiện chức năng di chuột trong Selenium WebDriver bằng Java?


131

Tôi muốn thực hiện chức năng di chuột qua menu thả xuống. Khi chúng ta di chuột qua menu, nó sẽ hiển thị các tùy chọn mới. Tôi đã cố gắng nhấp vào các tùy chọn mới bằng cách sử dụng xpath. Nhưng không thể nhấp vào các menu trực tiếp. Vì vậy, theo cách thủ công, tôi đang cố gắng di chuột qua menu thả xuống và sau đó sẽ nhấp vào các tùy chọn mới.

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

Kiểm tra trang web này để biết câu trả lời chi tiết - testautomationguru.com/ từ
vins

Câu trả lời:


115

Thật sự không thể thực hiện hành động 'chuột di chuột', thay vào đó bạn cần xâu chuỗi tất cả các hành động mà bạn muốn đạt được trong một lần. Vì vậy, di chuyển đến phần tử tiết lộ các phần tử khác, sau đó trong cùng một chuỗi, di chuyển đến phần tử hiện được tiết lộ và nhấp vào phần tử đó.

Khi sử dụng Chuỗi hành động, bạn phải nhớ 'làm điều đó như người dùng'.

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
Đối với tôi điều này không làm việc. Menu của tôi chỉ được di chuột nếu tôi thực hiện quá trình xây dựng (). Thực hiện () sau khi di chuyển ToEuity ()
GarfieldKlon

8
Lý do điều này sẽ không hoạt động là vì tất cả các cuộc gọi webdriver.findElement(By... something)được thực hiện trước bất kỳ điều gì khác (đó là cách duy nhất mà kết quả của chúng có thể được chuyển sang moveElement). Vào thời điểm đó, phần tử thứ hai mà bạn muốn tìm thấy chưa hiển thị vì phần tử thứ nhất vẫn phải được di chuột qua. Để khắc phục điều này, như bạn đã nói, bạn có thể chèn .perform()s trung gian , Sau đó, lần thứ hai findElement, di chuột đầu tiên sẽ được chỉnh sửa perform. Giải pháp đã cho có thể hoạt động, tùy thuộc vào việc triển khai trang, nhưng rõ ràng số dặm của bạn và tôi khác nhau.
Sander Verhagen

57

Không có câu trả lời nào trong số này hoạt động khi cố gắng làm như sau:

  1. Di chuột qua một mục menu.
  2. Tìm phần tử ẩn CHỈ có sẵn sau khi di chuột.
  3. Nhấp vào mục menu phụ.

Nếu bạn chèn lệnh 'thực hiện' sau moveToEuity, nó sẽ di chuyển đến phần tử và mục menu phụ hiển thị trong một khoảng thời gian ngắn, nhưng đó không phải là di chuột. Phần tử ẩn ngay lập tức biến mất trước khi có thể được tìm thấy dẫn đến ElementNotFoundException. Tôi đã thử hai điều:

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

Điều này đã không làm việc cho tôi. Sau đây làm việc cho tôi:

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

Sử dụng Hành động để di chuột và nhấp vào WebDriver tiêu chuẩn, tôi có thể di chuột và sau đó nhấp.


3
Ví dụ thứ hai cũng có hiệu quả với tôi khi thêm .perform ()
TheRed__ 27/2/2015

1
Không thể tin rằng đây vẫn là một vấn đề ... thậm chí nó không hoạt động: builder.moveToEuity (settings) .moveBy Offerset (0, 30) .moveToEuity (stagingMothy) .pause (20000) .keyDown (Keys.CONTROL) .click (staging .keyUp (Keys.CONTROL) .sendKeys (Keys.ENTER) .perform (); tôi thậm chí còn thấy trình kích hoạt di chuột css trên phần tử trong khoảng thời gian chờ. nhưng không có nhấp chuột nào được kích hoạt bất kể tôi cố gắng gì
Sangoku

Bạn sẽ xử lý như thế nào nếu có thể nhấp không phải là một yếu tố bình thường và nó giống như :: trước đây . Điều này trước khi xuất hiện khi bạn di chuột
Ashok kumar Ganesan

25

Dựa trên bài đăng trên blog này, tôi đã có thể kích hoạt di chuột bằng mã sau với Selenium 2 Webdo:

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
Giải pháp ít rõ ràng hơn, nhưng chắc chắn 100% cho thử nghiệm IE11 của tôi. Nếu bạn gặp vấn đề khi di chuột moveToElement, hãy sử dụng cái này! Tôi viết mã bằng C #, vì vậy đây không chỉ là cách Java để làm điều đó.
vt100


Đây là cái arguments[0]
Arian

@ArianHosseinzadeh nó được thông qua trong tham chiếu dom cho đối số thứ hai được chuyển đến executeScript(), đó làwebElement
Zugwalt

Tôi nhận được refignign cho người thực thi Javascript. Có gì refercne sao tôi cần phải thêm vào trong C #
mark1234

11

Mã này hoạt động hoàn toàn tốt:

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

Sau khi di chuột qua, bạn có thể tiếp tục thực hiện hành động tiếp theo bạn muốn trên thông tin được tiết lộ


Tuyệt vời chỉ cần thêmusing OpenQA.Selenium.Interactions;
SushiGuy

7

Kiểm tra ví dụ này làm thế nào chúng ta có thể thực hiện điều này.

nhập mô tả hình ảnh ở đây

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

}

Để biết câu trả lời chi tiết, hãy kiểm tra tại đây - http://www.testautomationguru.com/selenium-webdo-automating-hoverable-multilevel-dropdowns/


5

Tôi thấy câu hỏi này đang tìm cách thực hiện điều tương tự cho các bài kiểm tra Javascript của mình, sử dụng Protractor (một tiêu đề javascript cho Selenium.)

Giải pháp của tôi với thước đo góc 1.2.0 và webdo 2.1:

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

Điều này cũng chấp nhận một phần bù (tôi đang sử dụng nó để nhấp vào bên trên và bên trái của một phần tử :)

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

4

Chương trình mẫu để di chuột bằng 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
Vui lòng xem xét bao gồm một số thông tin về câu trả lời của bạn, thay vì chỉ đăng mã. Chúng tôi cố gắng cung cấp không chỉ "bản sửa lỗi", mà còn giúp mọi người tìm hiểu. Bạn nên giải thích những gì sai trong mã gốc, những gì bạn đã làm khác đi và tại sao (các) thay đổi của bạn hoạt động.
Andrew Barber

2
@AndrewBarber - Chương trình đã cho có thể thực sự giúp ích cho người dùng. Chương trình đó đang hoạt động đúng. Người dùng đã chấp nhận rằng ..
Giúp đỡ

4
Tôi không tranh chấp nó sẽ làm việc ; Tôi đang nói rằng bạn nên giải thích tại sao nó có thể hoạt động, tại sao những gì họ không hoạt động và những gì bạn đã thay đổi.
Andrew Barber

Mã này tương đương với OP và không trả lời câu hỏi. Không có bất kỳ thông tin theo ngữ cảnh, nó là thừa.
jpaugh

2

Bạn co thể thử:

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

Nếu bạn gặp trường hợp web có nhiều danh mục, hãy sử dụng phương pháp đầu tiên. Đối với menu bạn muốn, bạn chỉ cần phương pháp thứ hai.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.