2016-04-06 23 views
0

C#のSelenium WebdriverでMoveToElement関数に問題があります。 MoveToElementは何もしないようです。ナビゲーション項目がマウスでホバーされるまで、要素が見つからない場合、セレンMoveToElementが機能しない

<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> 

最も内側のリストを最初に隠されている:

は、私は、次のHTMLを持っています。

次に、Seleniumに表示されているnavigation-item-titleをクリックし、MembersTestPageリンクをクリックする次のコードを入力します。あなたは、私が要素を渡すことによって、また、手動でのアイテムのXとYの値を渡すことでMoveToElementを使用していたが、どちらも働いている見ることができます

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

XPathで要素を見つけると、これは期待どおりに機能します。

私は間違っていますか?おかげ

答えて

2

セレンでActionsを使用する場合はそれ以外のアクションがあるだけでBC、そしてあなたは、最終的にはPerform()メソッドを呼び出す必要があります内部で収集されたものの、ブラウザで実行されることはありません。

あなたはそれは問題ではありません

action.Perform(); 

または

action.Build().Perform(); 

を呼び出すことができます。 Build()を省略すると、Perform()が暗黙的に呼び出されます。

+0

これは完全に機能しました。それはとてもシンプルだったと信じられない、ありがとう! – youyong

0

は、私は最近、同様の問題を抱えていたし、私の解決策は、1つのアクションとして、すべてを実行することでした:

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(); 
関連する問題