1

亲爱的 Selenium Webdriver 专家,

在“/html/body/form/div[2]/div[4]/div[1]/div/div/div[1]/”上执行 XPath 查询时出现以下异常(在 if 语句中) 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。

您的建议将不胜感激。

提前致谢,

杰克

4

1 回答 1

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 选择器的信息,使用它们您可以执行以下操作,例如单击WebDriver<img>中的 MainImage 内部<div>

driver.findElement(By.cssSelector("div#ctl00_ctl00_Content_Content_propertyPhotos_MainImage_upnlHeroImage img")).click();
于 2012-11-29T09:41:22.893 回答