如果它们是动态的,则无法使用Selenium找到webelement

时间:2016-10-05 23:59:24

标签: java selenium dynamic selenium-webdriver

我在seleniumn中找到web元素时遇到困难,html如下:

<div class="d2l-fieldgroup">
<div class=" vui-field-row">
<span class="d2l-field vui-label d2l-offscreen">Do not ask me again for this application</span>
<label class="d2l-checkbox-container">
<input name="dontAsk" value="0" type="hidden">
<input id="dontAsk" class="d2l-checkbox vui-input vui-outline" type="checkbox">
Do not ask me again for this application
</label>
</div>
</div>

我需要点击复选框或文字,但我似乎无法做到这一点,因为我总是收到错误回复说:

Unable to locate element: {"method":"class name","selector"

我试过了:

WebElement do_not_ask_resourcebank = driver.findElement(By.className("d2l-fieldgroup"));
do_not_ask_resourcebank.click();

但是得到以下错误:

no such element: Unable to locate element: {"method":"class name","selector":"d2l-fieldgroup"}

我也尝试用vui-field-row和d2l-checkbox-container替换d2l-fieldgroup

我也尝试过:

WebElement do_not_ask_resourcebank = driver.findElement(By.cssSelector("html/body/form/div/div[3]/div/label"));

WebElement do_not_ask_resourcebank = driver.findElement(By.xpath("id('confirmForm')/x:div/x:div[3]/x:div/x:label"));

但我似乎无法点击这个元素,对像我这样的新手来说非常令人沮丧。有人能指出我哪里出错了吗?

1 个答案:

答案 0 :(得分:0)

如果您获得NoSuchElementException作为提供的例外情况,可能有以下原因: -

  • 您可能正在使用不正确的定位器进行定位,您正在找到具有类名的实际<div>元素,该类看起来像动态生成的类名而不是您想要的实际<input type = 'checkbox'>元素。其他也看起来不稳定,你应该尝试使用By.id()定位欲望元素: -

    WebElement do_not_ask_resourcebank = driver.findElement(By.id("dontAsk"));
    
  • 可能是在你要找到元素的时候,它不会出现在DOM上,所以你应该实现WebDriverWait等待元素可见,如下所示: -

    WebDriverWait wait = new WebDriverWait(driver, 10);
    WebElement el = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("dontAsk")));
    
  • 此元素可能位于任何frameiframe内。如果是,您需要在找到以下元素之前切换frameiframe: -

    WebDriverWait wait = new WebDriverWait(driver, 10);
    
    //Find frame or iframe and switch
    wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt("your frame id or name"));
    
    //Now find the element 
    WebElement el = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("dontAsk")));
    
    //Once all your stuff done with this frame need to switch back to default
    driver.switchTo().defaultContent();
    

已修改

  

我还没有尝试过iframe,因为我不确定我在做什么我还没有使用过这个工具。 iframe的html代码为:<iframe id="d2l_1_69_954" class="d2l-iframe d2l-iframe-fullscreen d2l_1_67_746" name="d2l_1_69_954" src="/d2l/lms/remoteplugins/lti/launchLti.d2l?ou=6606&plugin‌​Id=f8acc58b-c6d5-42d‌​f-99d9-e334f825c011&‌​d2l_body_type=3" title="TALLPOD" scrolling="auto" allowfullscreen="" onload="this.m_loaded=true;" style="height: 314px;" frameborder="0">您如何使用上面的示例找到此iframe?

看起来iframe idname都是动态生成的,每当您找到时都可以更改,您应该尝试使用唯一定位器找到此iframe,我认为它title name是唯一且固定的,所以在找到所需的元素之前,你应该尝试找到这个iframe: -

wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.cssSelector("iframe[title='TAFEPOC']"));