2013-04-30 30 views
8

EDYCJA: Więc wymyśliłem prosty sposób na najechanie na element, ale chcę poczekać, aż pojawi się wynik. Webdriver Chrome unosi się nad elementem i porusza się zbyt szybko, aby móc zobaczyć tekst. Jak mogę sprawić, aby pozostało nienaruszone, dopóki nie pojawi się tekst? Spojrzałem na Wait() i do(), ale nie mogę ich zmusić do prawidłowego działania (zakładam, że to dlatego, że tak naprawdę nie czekam na boolean, aby była prawdziwa w kodzie, chyba że ktoś ma jakieś sugestie?). Oto, co mam do tej pory ...Najedź na element i poczekaj z Selenium WebDriver używając Java

WebDriver driver = getWebDriver(); 
By by = By.xpath("//*[@pageid='" + menuItem + "']"); 
Actions action = new Actions(driver); 
WebElement elem = driver.findElement(by); 
action.moveToElement(elem); 
action.perform(); 

Jeszcze raz dziękuję wszystkim!

Pozdrawiam.

+0

Czy otrzymujesz jakieś błędy? Co stanie się z twoim aktualnym kodem? Czy najeżdża to tak szybko, że okienko znika? –

+0

Jakiej przeglądarki używasz? – acdcjunior

+0

Używam sterownika Chrome. Błąd, który dostaję, polega na tym, że elementu nie można znaleźć, ale wiem, że mam właściwy element. Komenda właśnie się kończy. Nie widzę, niestety, wyskakującego okienka. – dr4g1116

Odpowiedz

6

Wygląda na to, że byłem w metodzie po prostu nie czekał wystarczająco długo, aby tekst stał się widoczny. Dodanie prostej funkcji spania do końca było dokładnie tym, czego potrzebowałem.

@When("^I hover over menu item \"(.*)\"$") 
public void I_hover_over_menu_item(String menuItem) 
{ 
    WebDriver driver = getWebDriver(); 
    By by = By.xpath("//*[@pageid='" + menuItem + "']"); 
    Actions action = new Actions(driver); 
    WebElement elem = driver.findElement(by); 
    action.moveToElement(elem); 
    action.perform(); 
    this.sleep(2); 
} 

public void sleep(int seconds) 
{ 
    try { 
     Thread.sleep(seconds * 1000); 
    } catch (InterruptedException e) { 

    } 
} 

Nadzieję, że pomaga innym w podobnym wiązaniu!

Pozdrawiam!

+0

Korzystanie ze snu nie jest dobre. Zamiast tego możesz użyć WebDriverWait –

10

Nie można polegać na śpi, więc powinieneś spróbować tego:

WebElement myDynamicElement = (new WebDriverWait(driver, 10)) 
    .until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement"))); 

Masz mnóstwo metod w klasie ExpectedConditions.

Oto kilka informacji:

nadzieję, że ten użyteczny.

+0

Prawda, ale dla mojej aplikacji działa dobrze. Mógłbym to zmienić w przyszłości. Dziękuję bardzo za wkład! :) Chciałbym upvote to, gdybym mógł !! – dr4g1116

+0

@Carlos Mam taką samą sytuację jak dr4g1116, mój przypadek unosi się do głównego menu w przeglądarce Chrome i porusza się zbyt szybko, abym kliknął submenu. Próbowałem "action.moveToElement (mainmenu) .perform" i "submenu.waitforpresent(). Click();". Ale to nie działa w Chrome (działa bez problemu w Firefoksie). Jakieś sugestie? – user1559625

+0

@Carlos Mam link pod adresem http://stackoverflow.com/questions/35855636/why-hover-to-element-and-click-submenu-does-not-work-when-browser-is-opened-full – user1559625

1

Poniżej znajduje się kod w języku C# dla wskaźnika myszy.

Actions mousehover = new Actions(driver); 
IWebElement Element_Loc = driver.FindElement(By.XPath("html/body/div[1]/table/tbody/tr/td[2]/div[2]/table[2]")); 
mousehover.MoveToElement(Element_Loc).Build().Perform(); 
string Mouse_Text = driver.FindElement(By.XPath("html/body/div[1]/table/tbody/tr/td[2]/div[2]/table[2]")).GetAttribute("alt"); 

Boolean booltext = Mouse_Text.Equals("your mousehover text goes here."); 
Console.WriteLine(booltext); 

if (booltext.Equals(true)) 
{ 
    Console.WriteLine("The text is verified and matches expected"); 
} 
else 
{ 
    throw new Exception(" The text does not match the expected"); 
} 

Powyższy kod zasadzie używa MovToElement funkcją klasy akcji, a następnie zajmuje położenie elementu (xpath) i staje się jego atrybut, który może jak (alt, tytuł itp) i przechowuje je w ciąg. Później ta wartość jest porównywana z tekstem. Jeśli wartość boolowska jest prawidłowa, oznacza to, że test jest pozytywny.

2

Też mam problem podobny z tobą.

Rozwiązałem go.

Tak, myślę, że możemy wstawić opóźnienie lub użyć funkcji, (...). FindElements (...). Size(), dla lepszej wydajności. Jeśli wynik funkcji nie wynosi 0, możemy kliknąć lub wykonać element.

Zgodnie z "https://code.google.com/p/selenium/wiki/GettingStarted" i "WebDriver: check if an element exists?" możemy wstawić opóźnienie i użyć funkcji do ustalenia istnienia elementu, który chcieliśmy.

// Sleep until the div we want is visible or 5 seconds is over 
    long end = System.currentTimeMillis() + 5000; 
    while (System.currentTimeMillis() < end) { 
     List<WebElement> elements = driver.findElements(By.id("btn")); 

     // If results have been returned, the results are displayed in a drop down. 
     if (elements.size() != 0) { 
      driver.findElement(By.id("btn")).click(); 
      break; 
     } 
    } 

Poczekaj, aż pojawi się żądany element lub czas się skończy ~!

Powiązane problemy