我可以通过driver.findElement()
函数覆盖所有元素。
树元素是使用dhtmlx库创建的,当我尝试访问它们时,我得到NoSuchElementException 。
我试图通过id,xpath,class,text等来达到,但它们都没有为我工作。我也尝试了隐式等待和Thread.sleep()
方法,但结果是一样的。
> <tr> <td class="standartTreeImage"> <img border="0" align="absmiddle"
> style="padding: 0px; margin: 0px; width: 18px; height: 18px;"
> src="http://marduk:5543/atlas/themes/third_party/dhtmlx/dhtmlxTree/codebase/imgs/vse_datasources/plus3.gif">
> </td> <td width="20px" style="display: none;"> <img align="absmiddle"
> src="http://marduk:5543/atlas/themes/third_party/dhtmlx/dhtmlxTree/codebase/imgs/vse_datasources/iconUncheckAll.gif"
> style="width: 16px; height: 16px;"> </td> <td
> class="standartTreeImage" style="width: 18px;"> <img border="0"
> align="absmiddle" style="padding: 0px; margin: 0px; width: 18px;
> height: 18px;"
> src="http://marduk:5543/atlas/themes/third_party/dhtmlx/dhtmlxTree/codebase/imgs/vse_datasources/folderClosed.gif">
> </td> <td class="standartTreeRow" nowrap="" style="width: 100%;
> font-size: 10pt; cursor: pointer;"> <span class="standartTreeRow"
> style="padding-left: 5px; padding-right: 5px;">hr-istanbul [15]</span>
> </td> </tr>
例如,其中一个就是:我需要点击第一个td
。只有定位器是图像,但我无法访问该元素.NoSuchElementException。
element = driver.findElement(By.xpath("//img[contains(@src,'http://marduk:5543/atlas/themes/third_party/dhtmlx/dhtmlxTree/codebase/imgs/vse_datasources/plus3.gif')]"));
还试图到达最后一个列元素它也没有用。
element = driver.findElement(By.xpath("//*[contains(text(), 'hr-istanbul [15]')]"));
答案 0 :(得分:1)
如果您获得NoSuchElementException
作为提供的例外情况,可能有以下原因: -
可能是您找到了错误的定位器,因此您需要共享HTML以获得更好的定位器解决方案。
可能是在你要找到元素的时候,它不会出现在DOM
上,所以你应该实现WebDriverWait
等待元素可见,如下所示: -
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement el = wait.until(ExpectedConditions.visibilityOfElementLocated(byObject));
此元素可能位于任何frame
或iframe
内。如果是,您需要在找到以下元素之前切换frame
或iframe
: -
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(byObject));
//Once all your stuff done with this frame need to switch back to default
driver.switchTo().defaultContent();