2017-02-03 11 views
0

これを展開して折りたたむ機能を持つウィジェットボタンをクリックしようとしています。何らかの理由で、私はこの要素の特定にいくつかの困難を抱えています。私はいつもスローはNoSuchElementExceptionを得る:Seleniumを使用して要素(ウィジェット)を見つけることができませんNoSuchElementException

org.openqa.selenium.NoSuchElementException: 
no such element: Unable to locate element: {"method":"cssselector","selector":"span[id^='d2l_1_24']>a[title='Expand News']"} 

おかしい事はある、私は次のように何の困難を持っていない要素見つけるためには、FireFox放火犯を使用する場合:それは常にノードを返し

span[id^='d2l_1_24']>a[title='Expand News'] 
span[id^='d2l_1_24']>a[title='Collapse News'] 

を。

以前の質問を調査した後、私はウィジェットが別のiFrameにあると判断しました。開発ツールは、それがトップウィンドウにあることを示します。次のように

HTMLは、次のように

<div id="d2l_1_169_906" class="d2l-widget-header d2l-widget-header-clickable d2l_1_166_935 d2l_1_167_808 d2l_1_168_85 d2l_1_165_766" data-d2l-collapsed="d2l_1_165_766" onclick="D2L.O("__g1",25)()"> 
<div class="d2l-homepage-header-wrapper"> 
<div class="d2l-homepage-header-menu-wrapper"> 
<div class="d2l-homepage-header-collapse-wrapper"> 
<span id="d2l_1_24_470" class="d2l-expandcollapse d2l_1_117_742"> 
<a id="d2l_1_186_505" class="d2l-imagelink d2l_1_117_742 d2l_1_187_114 vui-outline" href="javascript:void(0);" onclick="return false;" title="Expand News" aria-label="Expand News" role="button"/> 
<a id="d2l_1_188_574" class="d2l-imagelink d2l_1_117_742 d2l_1_189_251 vui-outline d2l-hidden" href="javascript:void(0);" onclick="return false;" title="Collapse News" aria-label="Collapse News" role="button"/> 
</span> 
</div> 
<div class="d2l-clear"/> 
</div> 

私のコードは次のとおりです。

//instance fields 
static WebDriver driver; 
private WebElement news_widget_expand; 
private WebElement news_widget_collapse; 

//constructor 
public HomePage(){ 

    WebDriver driver; 

} 

public void set_pageobject_news_widget_dropdown(WebDriver driver){ 

    try { 

     driver.switchTo().defaultContent(); 
     news_widget_collapse = driver.findElement(By.cssSelector("span[id^='d2l_1_24']>a[title='Expand News']")); 
     //news_widget_expand = driver.findElement(By.xpath(".//*[starts-with(@id, 'd2l_1_186')]")); 
     //news_widget_expand = driver.findElement(By.cssSelector("div[class='d2l-homepage']>div>div>div>div>span[id^='d2l_1_24']>a[title='Expand News']")); 


     news_widget_collapse = driver.findElement(By.cssSelector("span[id^='d2l_1_24']>a[title='Collapse News']")); 
     //news_widget_collapse = driver.findElement(By.xpath(".//*[starts-with(@id, 'd2l_1_188')]")); 
     //news_widget_expand = driver.findElement(By.cssSelector("div[class='d2l-homepage']>div>div>div>div>span[id^='d2l_1_24']>a[title='Collapse News']")); 

    } catch (Exception e) { 
     System.out.println("Couldnt set page objects"); 
     e.printStackTrace(); 
    } 

} 

public void collapse_news(WebDriver driver) throws InterruptedException{ 

    try { 
     news_widget_collapse.click(); 
     Thread.sleep(1000); 
    } catch (Exception e) { 

     e.printStackTrace(); 
     System.out.println("Couldn't collapse the news widget..."); 
    } 
} 

public void expand_news(WebDriver driver) throws InterruptedException{ 

    try { 
     news_widget_expand.click(); 
     Thread.sleep(1000); 
    } catch (Exception e) { 

     e.printStackTrace(); 
     System.out.println("Couldn't expand the news widget..."); 
    } 

}

次のようにコードが呼び出されます。

Thread.sleep(2000); 
//expand the widget 
hp.set_pageobject_news_widget_dropdown(driver); 
hp.expand_news(driver); 

ですそこには何も明らかではない私はここで行方不明ですか?

+0

投稿したHTMLに基づき、 'Expand News'は' id = "d2l_1_186_505" ' –

+0

@ ScaryWombatです。idは静的ではなく、ページが更新されるたびに変わります。私は次のようにしてみました: 'driver.findElement(By.cssSelector(" div [id^= 'd2l_1_186 _'] [title = 'Expand News'] "))。 – tarquin

答えて

0

この回答が他の人にとって大いに役立つかどうかはわかりませんが、私はそれを解決することができました。私もWebElementsをしていたことを確認するには、以下のなかった

news_widget_expand = driver.findElement(By.cssSelector("div.d2l-homepage-header-collapse-wrapper>span>a[title='Expand News']")); 
news_widget_collapse = driver.findElement(By.cssSelector("div.d2l-homepage-header-collapse-wrapper>span>a[title='Collapse News']")); 

:私は、この問題は、CSSとHTMLでの作業でいくつかの経験不足が原因だと思うが、私は次の操作を実行した場合、私は上記のコード作業を取得することができています指定されたcssSelectorを持っていたWebElementsの全てを取得WebElementリストを作成することで、画面上に見える事実:

enter List<WebElement> buttons = driver.findElements(By.cssSelector("div.d2l-homepage-header-collapse-wrapper>span>a")); 
     int noButtons = buttons.size(); 
     System.out.println("Total webelements = "+noButtons); 
     if(noButtons>0){ 
      for(WebElement b : buttons){ 

       if(b.getAttribute("title").contains("Expand News")) 
        b.click(); 
       if(b.getAttribute("title").contains("Collapse News")) 
        b.click(); 


      } 
     }else 
      System.out.println(b.getAttribute("title"));code here 

私は、ページが、私はちょうど属性「タイトル」を含むようにCSSを変更し、要素が含まれていることが確認されたら、次のようにインスタンスフィールドを設定します。

news_widget_expand = driver.findElement(By.cssSelector("div.d2l-homepage-header-collapse-wrapper>span>a[title='Expand News']")); 

Webdriverにxpathやさまざまなcssselectorsなどの要素をクリックさせてもらうために、この方法を試してみるのに多くの時間を浪費しました。私は最終的にそこに着いて、間違いなくWebElementをループして、要素が実際にそこにあることを確信しました。

関連する問題