2016-04-06 4 views
0

Probleme mit der MoveToElement-Funktion in Selenium Webdriver for C#. Das MoveToElement scheint nichts zu tun.Selenium MoveToElement funktioniert nicht, wenn Element nicht von XPath gefunden wird

Ich habe folgende HTML:

<div id="rounded-navigation-with-icons"> 
    <ul> 
     <li class="navigation-item"> 
      <a href="Members" target="_self" class="navigation-item-title"></a> 
      <ul>      
       <li> 
        <a href="MembersTestPage" target="_self"></a> 
       </li> 
      </ul> 
     </li> 
    </ul> 
</div> 

Die am weitesten innen Liste wird zunächst versteckt, bis der Navigationspunkt mit der Maus schwebt über ist.

Ich habe dann den folgenden Code, um auf den Navigation-Element-Titel zu klicken, der für Selenium sichtbar ist, und klicken Sie dann auf den MembersTestPage-Link.

public bool SearchForElement(string elementToFind, Page.FindBy by) 
    { 
     var navigation = Page.FindElement("rounded-navigation-with-icons", Page.FindBy.ID); 
     if (navigation != null) 
     { 
      foreach (var item in navigation.FindElements(By.ClassName("navigation-item"))) 
      { 
       var titleElements = Page.FindElements("navigation-item-title", Page.FindBy.ClassName); 
       Actions action = new Actions(Driver.Instance); 
       foreach (var moveToItem in titleElements) 
       { 
        try 
        { 
         // Move to the main navigation link container element, but it doesn't work 
         action.MoveToElement(moveToItem); 

         // Move the mouse position manually to the link's location 
         action.MoveByOffset(moveToItem.Location.X, moveToItem.Location.Y); 

         // This does correctly find the element 
         var element = Page.FindElement("a[href='MembersTestPage']", Page.FindBy.CssSelector); 
         action.MoveToElement(element); 

         // Click returns that the element is hidden/invisible and therefore cannot be clicked 
         element.Click(); 
         return true; 
        } 
        catch (Exception) 
        { 
        } 
       } 
      } 
     } 
     return false; 
    } 

Sie können sehen, ich habe moveToElement verwendet, indem das Element vorbei, und auch durch manuell die X- und Y-Werte des Elements vorbei, aber weder arbeiten.

Wenn ich die Elemente von XPath finden, funktioniert dies wie erwartet.

Was mache ich falsch? Dank

Antwort

2

Bei der Verwendung von Actions in Selenium, dann muss man schließlich die Perform() Methode aufrufen, bc sonst die Aktionen sind nur intern gesammelt, aber nie im Browser ausgeführt.

können Sie entweder rufen

action.Perform(); 

oder

action.Build().Perform(); 

Es spielt keine Rolle. Wenn Sie die Build() weglassen, dann ruft Perform() implizit es auf.

+0

Das hat perfekt funktioniert. Ich kann nicht glauben, dass es so einfach war, danke! – youyong

0

ich ähnliches Problem vor kurzem und war meine Lösung auszuführen alles als eine Aktion durchgeführt hat:

action.MoveToElement(moveToItem) 
     .MoveByOffset(moveToItem.Location.X, moveToItem.Location.Y) 
     .MoveToElement(Page.FindElement("a[href='MembersTestPage']", Page.FindBy.CssSelector)) 
     .click(Page.FindElement("a[href='MembersTestPage']", Page.FindBy.CssSelector)) 
     .build() 
     .perform(); 
Verwandte Themen