无法使用Selenium NoSuchElementException定位元素(小部件)

时间:2017-02-03 01:45:24

标签: java 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 firebug定位元素时,我对以下内容没有任何困难:

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

我有什么明显的遗失吗?

1 个答案:

答案 0 :(得分:0)

不确定这个答案是否对其他人有用,但我设法解决了这个问题。我认为这个问题是由于在使用css和html方面缺乏经验,但如果我执行以下操作,我可以使上述代码正常工作:

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']"));

我还通过创建一个WebElement列表来确认WebElements实际上在屏幕上是可见的,以获取具有指定cssSelector的所有WebElements:

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的元素以包含属性'title'并设置实例字段,如下所示:

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

我浪费了很多时间来尝试不同的方法让Webdriver点击元素,例如xpath和不同的cssselectors。我最终到达那里,肯定循环通过WebElement让我相信这些元素实际上就在那里。