即使此元素存在,也会收到NoSuchElementException

时间:2012-11-28 13:25:21

标签: selenium selenium-webdriver

亲爱的Selenium Webdriver专家,

执行XPath查询时,我收到以下异常(在if语句中) “/ html / body / form / div [2] / div [4] / div [1] / div / div / div [1] / a”来自http://www.domain.com.au/Property/For-Sale/House/NSW/Auburn/?adid=2010111460

Exception in thread "main" org.openqa.selenium.NoSuchElementException: Unable to locate element: {"method":"xpath","selector":"/html/body/form/div[2]/div[4]/div[1]/div/div/div[1]/a"}

以下是发生此异常的代码段:

WebDriver driver = new FirefoxDriver(firefoxProfile);
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://www.domain.com.au/Property/For-Sale/House/NSW/Auburn/?adid=2010111460");

if (driver.findElement(By.xpath("/html/body/form/div[2]/div[4]/div[1]/div/div/div[1]/a")).isDisplayed() && 
    driver.findElement(By.xpath("/html/body/form/div[2]/div[4]/div[1]/div/div/div[1]/a")).getAttribute("href").length() > 0) {
    WebElement photoPageElement = driver.findElement(By.xpath("/html/body/form/div[2]/div[4]/div[1]/div/div/div[1]/a"));
    photoPageURL = photoPageElement.getAttribute("href");
    .....
} 

此代码段已成功找到其他属性(例如http://www.domain.com.au/Property/For-Sale/House/NSW/Auburn/?adid=2010007127)中的相同元素。

我正在寻找一个高质量的XML / XHTML资源管理器来遍历同一个文档,以便找出导致此类异常的原因。

是否可以检查元素是否存在而没有异常风险?我认为driver.findElement(By.xpath(....)。isDisplayed())就是为了做到这一点。

我在Windows XP / 7上运行Selenium Webdriver 2.25.0,Java 7.0,Netbeans 7.2。

非常感谢您的建议。

提前致谢,

杰克

1 个答案:

答案 0 :(得分:0)

我建议你开始使用CSS和id定位器而不是XPath来使你的脚本更具可读性和健壮性。 CSS定位器也应该更快,在运行更大的测试套件时会派上用场。为了找出元素定位器,有很多选择:没有安装任何东西,右键单击 - >例如,检查Chrome和Firefox中的元素以及IE中的开发人员工具。

您的XPath定位器可能存在一些问题,导致NoSuchElementException。如果您期望这样,您可以捕获异常,但如果要获取链接URL,您可能不希望这样做。

例如,查看您首先链接的页面,大图片包含在a元素中:

<a id="ctl00_ctl00_Content_Content_propertyPhotos_MainImage_MainPhotoLink" class="feature" target="ImageWindow" href="/ore/Public/Gallery/Photo.aspx?adid=2010111460&pic=1&mode=Buy"> 

在Java中使用带有WebDriver的id找到此元素:

WebElement element = driver.findElement(By.id("ctl00_ctl00_Content_Content_propertyPhotos_MainImage_MainPhotoLink"));

然后阅读href:

String linkHref = element.getAttribute("href");

您可以阅读有关CSS选择器here的内容,您可以使用它们执行操作,例如单击WebDriver中MainImage <img>内的<div>

driver.findElement(By.cssSelector("div#ctl00_ctl00_Content_Content_propertyPhotos_MainImage_upnlHeroImage img")).click();