Chcę wykonać funkcję najechania kursorem myszy na menu rozwijane. Kiedy najedziemy kursorem na menu, pokaże się nowe opcje. Próbowałem kliknąć nowe opcje za pomocą xpath. Ale nie można bezpośrednio klikać menu. Tak więc, w sposób ręczny, próbuję najechać kursorem na rozwijane menu, a następnie kliknę nowe opcje.
Actions action = new Actions(webdriver);
WebElement we = webdriver.findElement(By.xpath("//html/body/div[13]/ul/li[4]/a"));
action.moveToElement(we).build().perform();
java
selenium
selenium-webdriver
mouseover
Pradeep SJ
źródło
źródło
Odpowiedzi:
Naprawdę nie jest możliwe wykonanie akcji „najechania myszą”, zamiast tego musisz połączyć w łańcuch wszystkie działania, które chcesz osiągnąć za jednym razem. Więc przejdź do elementu, który odsłania pozostałe, a następnie w tym samym łańcuchu przejdź do teraz odkrytego elementu i kliknij go.
Korzystając z łańcuchów akcji, musisz pamiętać, aby „robić to tak, jak zrobiłby to użytkownik”.
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();
źródło
webdriver.findElement(By... something)
są wykonywane przed czymkolwiek innym (tylko w ten sposób można przekazać ich wynikmoveElement
). W tym momencie drugi element, który chcesz znaleźć, nie jest jeszcze widoczny, ponieważ pierwszy wciąż trzeba najechać kursorem. Aby to naprawić, jak powiedziałeś, możesz wstawić pośrednie.perform()
s, a następnie po drugiefindElement
, pierwszy najechanie kursorem zostanieperform
edytowany. Podane rozwiązanie może działać, w zależności od implementacji strony, ale podobno Twój i mój przebieg różnił się.Żadna z tych odpowiedzi nie działa, gdy próbujesz wykonać następujące czynności:
Jeśli wstawisz polecenie „wykonaj” po elemencie moveToElement, zostanie ono przeniesione do elementu, a pozycja podmenu jest wyświetlana przez krótki czas, ale nie jest to najechanie kursorem. Ukryty element natychmiast znika, zanim można go znaleźć, powodując wyjątek ElementNotFoundException. Próbowałem dwóch rzeczy:
Actions builder = new Actions(driver); builder.moveToElement(hoverElement).perform(); builder.moveToElement(clickElement).click().perform();
To nie zadziałało dla mnie. Pracowały dla mnie:
Actions builder = new Actions(driver); builder.moveToElement(hoverElement).perform(); By locator = By.id("clickElementID"); driver.click(locator);
Używając Akcji do najechania kursorem i standardowego kliknięcia WebDriver, mogłem najechać kursorem, a następnie kliknąć.
źródło
Na podstawie tego wpisu na blogu udało mi się wywołać najechanie przy użyciu następującego kodu z 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);
źródło
moveToElement
, użyj tego! Programuję w C #, więc nie jest to tylko sposób na Java.Example
arguments[0]
?executeScript()
, którym jestwebElement
Ten kod działa doskonale:
Actions builder = new Actions(driver); WebElement element = driver.findElement(By.linkText("Put your text here")); builder.moveToElement(element).build().perform();
Po najechaniu kursorem myszy możesz przejść do następnej czynności, jaką chcesz, na ujawnionych informacjach
źródło
using OpenQA.Selenium.Interactions;
Sprawdź ten przykład, jak moglibyśmy to zaimplementować.
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(); } }
Aby uzyskać szczegółową odpowiedź, sprawdź tutaj - http://www.testautomationguru.com/selenium-webdriver-automating-hoverable-multilevel-dropdowns/
źródło
Znalazłem to pytanie, szukając sposobu, aby zrobić to samo dla moich testów Javascript, używając Protractor (nakładka javascript do Selenium).
Moje rozwiązanie z kątomierzem 1.2.0 i webdriverem 2.1:
browser.actions() .mouseMove( element(by.css('.material-dialog-container')) ) .click() .perform();
To również akceptuje przesunięcie (używam go do klikania powyżej i po lewej stronie elementu :)
browser.actions() .mouseMove( element(by.css('.material-dialog-container')) , -20, -20 // pixel offset from top left ) .click() .perform();
źródło
Przykładowy program do najechania myszą przy użyciu 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(); } }
źródło
Możesz spróbować:
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();
Jeśli miałeś przypadek, że sieć ma wiele kategorii, użyj pierwszej metody. W przypadku menu, które chcesz, potrzebujesz tylko drugiej metody.
źródło