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


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/...
ヴァン

回答:


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
私にとってこれはうまくいきません。moveToElement()の後にbuild()。perform()を実行した場合にのみ、メニューがホバーされます
GarfieldKlon

8
これがうまくいかない理由は、へのすべての呼び出しwebdriver.findElement(By... something)が何よりも先に実行されるためです(これが結果をに渡すことができる唯一の方法moveElementです)。その時点では、最初の要素をホバーする必要があるため、検索する2番目の要素はまだ表示されていません。これを修正するには、あなたが言ったように、中間.perform()のを挿入できます。次に、2番目のfindElementについて、最初のホバーがperform編集されます。与えられた解決策はページの実装によっては機能するかもしれませんが、明らかにあなたと私のマイレージは異なりました。
Sander Verhagen、2014

57

次のことを行おうとすると、これらの回答はどれも機能しません。

  1. メニュー項目にカーソルを合わせます。
  2. ホバー後にのみ利用できる非表示要素を見つけます。
  3. サブメニュー項目をクリックします。

moveToElementの後に「実行」コマンドを挿入すると、要素に移動し、サブメニュー項目が少しの間表示されますが、ホバーではありません。非表示の要素が見つかる前にすぐに非表示になり、ElementNotFoundExceptionが発生します。私は2つのことを試しました:

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
2番目の例は、.perform()を追加するときにもうまくいきました
TheRed__ 2015

1
これはまだ問題です...これでも機能しない:builder.moveToElement(settings).moveByOffset(0、30).moveToElement(stagingMenu).pause(20000).keyDown(Keys.CONTROL).click(stagingMenu) .keyUp(Keys.CONTROL).sendKeys(Keys.ENTER).perform(); タイムアウトスパンの要素でホバーcssがトリガーされるのもわかります。しかし、何のクリックは私がしようとどのような関係なくtriggerdを取得していない
三国

クリッカブルが通常の要素ではなく、:: beforeのような場合、どのように処理しますか。これは、マウスをホバーしたときに表示されます
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
あまり明確ではないソリューションですが、IE11テストでは100%安定しています。でホバリングに問題がある場合はmoveToElement、これを使用してください!私はC#でコーディングしているので、それを行う方法はJavaだけではありません。
vt100


これは何arguments[0]ですか?
Arian

@ArianHosseinzadehは、に渡された2番目の引数へのdomで渡された参照ですexecuteScript()。これはwebElement
Zugwalt

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 2018

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

Protractor(Seleniumのjavascriptフロントエンド)を使用して、私のJavascriptテストに対して同じことを行う方法を探しているこの質問を見つけました。

分度器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、2014

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

ウェブに多くのカテゴリがある場合は、最初の方法を使用してください。必要なメニューについては、2番目の方法が必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.