3 回答

TA貢獻2016條經驗 獲得超9個贊
我通過將我的更新XPath
為:
/descendant::input[@value = 'Delete']
我現在能夠識別正確的元素。但是,我仍然不清楚為什么原來的XPath
不起作用,而這個起作用 - 因為根據幾篇文章,我讀到 '//' 是后代或自我的簡寫和 . 添加,以便搜索相對于父元素開始。所以這個原因對我來說仍然沒有意義。
如果有人可以提供帶有解釋的更新答案,我將選擇該答案作為問題的答案,而不是我自己的答案。

TA貢獻1906條經驗 獲得超10個贊
使用 css 選擇器而不是 xpath 嘗試下面的代碼。
List<WebElement> rows = driver.findElements(By.cssSelector("#savedCartViewForm .a-row"));
rows.forEach(row -> {
WebElement deleteButton = row.findElement(By.cssSelector("input[value = 'Delete']"));
System.out.println(deleteButton.getAttribute("aria-label"));
});
使用 xpath:
List<WebElement> rows = driver.findElements(By.xpath("//form[@id = 'savedCartViewForm']//div[contains(@class, 'a-row')]"));
rows.forEach(row -> {
WebElement deleteButton = row.findElement(By.xpath(".//input[@value = 'Delete']"));
System.out.println(deleteButton.getAttribute("aria-label"));
});

TA貢獻1911條經驗 獲得超7個贊
這是 Selenium 變得復雜的地方之一。Xpath 功能取決于幾件事。
有些瀏覽器支持原生 Xpath,有些則不支持(假設這總是會發生變化)。
一些驅動程序使用本機瀏覽器實現,而另一些則不使用(假設這總是會發生變化)。
如果由于某種原因不支持本機,Selenium 將退回到 Wicked Good Xpath 支持。
對于不同的瀏覽器和不同的驅動程序二進制版本,您現在可能具有不同的功能。讓我們假設所有本機實現都 100% 符合規范。
如果您遇到回退到 Wicked Good Xpath 的驅動程序二進制/瀏覽器版本,它并不完全 100% 符合規范,您可能會看到以下錯誤:
https://github.com/google/wicked-good-xpath/issues/43
現在請記住,Selenium 使用了 Wicked good Xpath 的分叉版本,因此它可能與上面的有所不同。從歷史上看 // 在 Selenium 世界中并不意味著后代或自我,它意味著搜索整個 DOM。Wicked Good Xpath 的當前 Selenium 實現可在以下位置獲得:
由于您已經解決了問題的解決方案是后裔或自我,但由于速記版本“//”在 Wicked Good XPath 中意味著其他內容,因此您沒有得到預期的結果。
TL;博士;
在為 Selenium 測試構建 Xpath 時不要使用 Xpath 簡寫。
添加回答
舉報