亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Selenium:無法從父元素中提取子元素

Selenium:無法從父元素中提取子元素

幕布斯6054654 2022-07-14 09:44:54
我正在嘗試使用以下結構單擊元素:parentElement.findElement(XPath of Child Element);但是,這會拋出org.openqa.selenium.NoSuchElementException.我目前正在使用XPath:抓?。ǜ福┰亓斜?//*[@id='savedCartViewForm']/div/div。這標識了正確的元素列表(按預期工作)。獲得列表后,我將應用該功能:parentElement.findElement(By.xpath(XPath));使用XPath:.//input[contains(@aria-label,'Delete')]和.//input[contains(@value,'Delete')]然而這會觸發org.openqa.selenium.NoSuchElementException。我已經在 SO 上研究了幾個小時,并根據幾篇文章添加了“?!?nbsp;在兩個斜杠之前,這意味著相對于父級(而不是相對于整個 DOM)。如果我刪除點,我總是會得到頁面上的第一個元素——而不是列表中每個父元素的子元素。
查看完整描述

3 回答

?
慕沐林林

TA貢獻2016條經驗 獲得超9個贊

我通過將我的更新XPath為:

/descendant::input[@value = 'Delete']

我現在能夠識別正確的元素。但是,我仍然不清楚為什么原來的XPath不起作用,而這個起作用 - 因為根據幾篇文章,我讀到 '//' 是后代或自我的簡寫和 . 添加,以便搜索相對于父元素開始。所以這個原因對我來說仍然沒有意義。

如果有人可以提供帶有解釋的更新答案,我將選擇該答案作為問題的答案,而不是我自己的答案。


查看完整回答
反對 回復 2022-07-14
?
隔江千里

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"));

});


查看完整回答
反對 回復 2022-07-14
?
Smart貓小萌

TA貢獻1911條經驗 獲得超7個贊

這是 Selenium 變得復雜的地方之一。Xpath 功能取決于幾件事。

  1. 有些瀏覽器支持原生 Xpath,有些則不支持(假設這總是會發生變化)。

  2. 一些驅動程序使用本機瀏覽器實現,而另一些則不使用(假設這總是會發生變化)。

  3. 如果由于某種原因不支持本機,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 實現可在以下位置獲得:

https://github.com/SeleniumHQ/selenium/tree/07a18746ff756e90fd79ef253a328bd7dfa9e6dc/third_party/js/wgxpath

由于您已經解決了問題的解決方案是后裔或自我,但由于速記版本“//”在 Wicked Good XPath 中意味著其他內容,因此您沒有得到預期的結果。

TL;博士;

在為 Selenium 測試構建 Xpath 時不要使用 Xpath 簡寫。


查看完整回答
反對 回復 2022-07-14
  • 3 回答
  • 0 關注
  • 237 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號