2

Firebugを使用するとうまく機能するXpathを使用して要素を見つける次のコードがあります。プログラムを実行すると、次の例外が発生します。

スレッド "main" org.openqa.selenium.NoSuchElementException での例外: 要素が見つかりません: {"method":"xpath","selector":"(//div[@class=\" x-ignore x-menu x -component \"]//div)/a[text()=\"ID\"]"}

その正確なxpathを取得してFirebugに固執すると、要素を問題なく見つけることができます。Seleniumがそれを見つけられない理由はありますか?

これが私のコードです:

public static void displayColumn(String column) throws Exception {
    String columnOptionsDropdownXpath = "(//div[@class=\"x-grid3-header\"]//span)[1]/../a";
    String columnXpath = "(//div[@class=\"x-grid3-header\"]//span)[1]";
    String columnsXpath = "(//div[@class=\" x-ignore x-menu x-component\"]//a)[3]";
    String columnToDisplayXpath = "(//div[@class=\" x-ignore x-menu x-component \"]//div)/a[text()=\"" + column + "\"]";

    // Because the 'column options' button doesn't appear until you hover over the column
    WebElement col = null;
    try {
        col = driver.findElement(By.xpath(columnXpath));
    } catch (NoSuchElementException e) {
        System.out.println("Column not found - is it displayed?");
    }

    Actions builder = new Actions(driver);
    builder.moveToElement(col).build().perform();
    WebElement element = driver.findElement(By.xpath(columnOptionsDropdownXpath));
    element.click();
    Thread.sleep(500);

    element = driver.findElement(By.xpath(columnsXpath));
    builder.moveToElement(element).build().perform();
    Thread.sleep(2000);
    WebDriverWait wait = new WebDriverWait(driver, 10);
    try {
        System.out.println("in try statement");
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(columnToDisplayXpath)));
    } catch (TimeoutException e) {}

    element = driver.findElement(By.xpath(columnToDisplayXpath));
    element.click();
}
4

1 に答える 1

2

コメントで述べたように、これら 2 つの XPath のわずかな違いは次のとおりです。

String columnsXpath = "(//div[@class=\" x-ignore x-menu x-component\"]//a)[3]";
String columnToDisplayXpath = "(//div[@class=\" x-ignore x-menu x-component \"]//div)/a[text()=\"" + column + "\"]";

最後の部分に加えて、後者には「コンポーネント」の後にスペースがあり、前者にはありません。

normalize-space() を使用し、比較値の先頭と末尾のスペースを削除すると、@class属性値の間隔の不一致を解決できるのではないかと思います。

String columnsXpath = "(//div[normalize-space(@class) = \"x-ignore x-menu x-component\"]//a)[3]";
String columnToDisplayXpath = 
    "(//div[normalize-space(@class) = \"x-ignore x-menu x-component\"]//div)/a[text()=\""
    + column + "\"]";
于 2013-01-18T20:38:44.363 に答える