web-dev-qa-db-ja.com

Javaを使用してSelenium WebDriverでマウスオーバー機能を実行する方法

ドロップダウンメニュー上でマウスオーバー機能を行いたい。メニューにカーソルを合わせると、新しいオプションが表示されます。私は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();
114
pradeep_tester

「マウスホバー」アクションを実行することは、実際には不可能です。代わりに、一度に達成したいアクションをすべて連鎖させる必要があります。それで、他を明らかにする要素に移動してください、そして同じ連鎖の間に、今明らかにされた要素に移動して、そしてそれをクリックしてください。

アクションチェーンを使用するときは、「ユーザーのようにする」ことを忘れないでください。

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();
99
Mark Rowlands

次のことをしようとしても、これらの答えはどれもうまくいきません。

  1. メニュー項目にカーソルを合わせます。
  2. ホバー後にのみ使用可能な隠し要素を見つけます。
  3. サブメニュー項目をクリックしてください。

MoveToElementの後に「perform」コマンドを挿入すると、それがその要素に移動し、サブメニュー項目がしばらく表示されますが、それはホバーではありません。隠された要素はそれが見つかる前に即座に消えて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をクリックして、ホバーしてから[クリック]することができます。

51
zmorris

この ブログ投稿に基づいて、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);
24
Zugwalt

このコードは完璧に動作します。

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

マウスオーバー後は、明らかになった情報に対して次の操作を実行できます。

10
user7123229

これをどのように実装できるか、この例を確認してください。

enter image description here

public class HoverableDropdownTest {

    private WebDriver driver;
    private Actions action;

    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/

6
vins

Protractor(SeleniumのJavaScriptフロントエンド)を使用して、私のJavascriptテストで同じことを実行する方法を探している私は、この質問に気付きました。

分度器1.2.0とWebドライバ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();
5
Plato

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


}

}
4
Helping Hands

あなたが試すことができます

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

あなたがウェブに多くのカテゴリがある場合があったら、最初の方法を使用してください。あなたが欲しいメニューのために、あなたはただ第二の方法が必要です。

2
Prasetyo Budi