Java kullanarak Selenium WebDriver'da mouseover işlevi nasıl gerçekleştirilir?


132

Bir açılır menü üzerinde fareyle üzerine gelme işlevi yapmak istiyorum. Menünün üzerine geldiğimizde, yeni seçenekleri gösterecektir. Xpath kullanarak yeni seçenekleri tıklamayı denedim. Ancak menülere doğrudan tıklayamaz. Bu yüzden, manuel yol olarak açılır menünün üzerine gelmeye çalışıyorum ve ardından yeni seçenekleri tıklayacağım.

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

Ayrıntılı cevap için bu siteyi kontrol edin - testautomationguru.com/…
vins

Yanıtlar:


116

Bir 'fare vurgulu' eylemi gerçekleştirmek gerçekten mümkün değildir, bunun yerine tek seferde gerçekleştirmek istediğiniz tüm eylemleri zincirlemeniz gerekir. Öyleyse diğerlerini ortaya çıkaran öğeye gidin, ardından aynı zincir sırasında, şimdi açığa çıkan öğeye gidin ve üzerine tıklayın.

Aksiyon Zincirlerini kullanırken 'bunu bir kullanıcının yapacağı gibi yapmayı' unutmamalısınız.

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
Benim için bu işe yaramıyor. Bir build () gerçekleştirirsem menümün üzerine geliniyor. Perform () moveToElement ()
GarfieldKlon

8
Bunun pek işe yaramamasının nedeni, tüm çağrıların webdriver.findElement(By... something)her şeyden önce yürütülmesidir (sonuçlarının aktarılmasının tek yolu budur moveElement). O sırada, bulmak istediğiniz ikinci öğe henüz görünmüyor çünkü ilk öğenin hala üzerine getirilmesi gerekiyor. Bunu düzeltmek için, dediğin gibi, ara .perform()s ekleyebilirsin , Sonra ikincisi için findElement, ilk fareyle üzerine gelme yapılmış olacak perform. Verilen çözüm, sayfanın uygulanmasına bağlı olarak işe yarayabilir, ancak görünüşe göre sizin ve benim mesafem farklıydı.
Sander Verhagen

57

Aşağıdakileri yapmaya çalışırken bu yanıtların hiçbiri işe yaramaz:

  1. Bir menü öğesinin üzerine gelin.
  2. YALNIZCA fareyle üzerine geldikten sonra kullanılabilen gizli öğeyi bulun.
  3. Alt menü öğesini tıklayın.

MoveToElement'den sonra bir 'perform' komutu eklerseniz, öğeye taşınır ve alt menü öğesi kısa bir süre gösterilir, ancak bu bir fareyle üzerine gelme değildir. Gizli öğe, bulunamadan hemen kaybolur ve bir ElementNotFoundException ile sonuçlanır. İki şeyi denedim:

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

Bu benim için işe yaramadı. Aşağıdakiler benim için çalıştı:

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

Eylemler üzerine gelip standart WebDriver tıklamasını kullanarak üzerine gelip tıklayabilirim.


3
İkinci örnek, .perform () eklerken benim için de çalıştı
TheRed__

1
Bunun hala bir sorun olduğuna inanamıyorum ... bu bile işe yaramıyor: builder.moveToElement (ayarlar) .moveByOffset (0, 30) .moveToElement (stagingMenu) .pause (20000) .keyDown (Keys.CONTROL) .click (stagingMenu) .keyUp (Keys.CONTROL) .sendKeys (Keys.ENTER) .perform (); zaman aşımı süresinde öğede hover css tetikleyicisini bile görüyorum. ancak ne denersem deneyeyim hiçbir tıklama tetiklenmiyor
Sangoku

Tıklanabilir, normal bir öğe değilse ve :: daha önce olduğu gibi gelirse nasıl davranırdınız ? Bu, fareyle üzerine geldiğinizde görünür hale gelir
Ashok kumar Ganesan

25

Bu blog gönderisine dayanarak, Selenium 2 Webdriver ile aşağıdaki kodu kullanarak gezinmeyi tetikleyebildim:

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
Daha az belirgin çözüm, ancak IE11 testim için% 100 sağlam. Gezinirken sorun yaşıyorsanız moveToElement, bunu kullanın! C # ile kodluyorum, bu yüzden bunu yapmanın sadece Java yolu değil.
vt100

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

Bu arguments[0]nedir?
Arian

@ArianHosseinzadeh, geçen ikinci argümana referans olarak geçti executeScript(), ki bu awebElement
Zugwalt

Javascript yürütücüsü için hatalı referans alıyorum. C #
mark1234

11

Bu kod çok iyi çalışıyor:

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

Fare üzerine geldikten sonra, açığa çıkan bilgiler üzerinde istediğiniz bir sonraki eylemi gerçekleştirmeye devam edebilirsiniz.


Mükemmel sadece eklemek zorunda kaldıusing OpenQA.Selenium.Interactions;
SushiGuy

7

Bunu nasıl uygulayabileceğimizi bu örneği kontrol edin.

görüntü açıklamasını buraya girin

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

}

Ayrıntılı cevap için burayı kontrol edin - http://www.testautomationguru.com/selenium-webdriver-automating-hoverable-multilevel-dropdowns/


5

Bu soruyu, Protractor (Selenium'un bir javascript ön ucu) kullanarak Javascript testlerim için aynı şeyi yapmanın bir yolunu ararken buldum.

İletki 1.2.0 ve webdriver 2.1 ile çözümüm:

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

Bu aynı zamanda bir ofseti de kabul eder (bunu bir öğenin yukarısına ve soluna tıklamak için kullanıyorum :)

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

4

Selenium java WebDriver kullanarak fareyle üzerine gelmek için örnek program:

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
Lütfen kodu göndermek yerine yanıtınızla ilgili bazı bilgiler eklemeyi düşünün. Sadece 'düzeltmeler' sağlamaya değil, aynı zamanda insanların öğrenmesine yardımcı olmaya çalışıyoruz. Orijinal kodda neyin yanlış olduğunu, neyi farklı yaptığınızı ve yaptığınız değişikliklerin neden işe yaradığını açıklamalısınız.
Andrew Barber

2
@AndrewBarber - Verilen program kullanıcıya gerçekten yardımcı olabilir. Bu program düzgün çalışıyor. Kullanıcı bunu zaten kabul etti ..
Helping Hands

4
İşe yarayacağına itiraz etmiyorum ; Neden işe yarayabileceğini, neden çalışmadıklarını ve neyi değiştirdiğinizi açıklamanız gerektiğini söylüyorum .
Andrew Barber

Bu kod, OP'lerin eşdeğeridir ve soruyu yanıtlamaz. Herhangi bir bağlamsal bilgi olmadan gereksizdir.
jpaugh

2

Deneyebilirsin:

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

Web'de birçok kategoriye sahipseniz, ilk yöntemi kullanın. İstediğiniz menü için ikinci yönteme ihtiyacınız var.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.