java - Selenium:无法从父元素中提取子元素
问题描述
我正在尝试使用以下结构单击元素:
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 上研究了几个小时,并根据几篇文章添加了“。” 在两个斜杠之前,这意味着相对于父级(而不是相对于整个 DOM)。
如果我删除点,我总是会得到页面上的第一个元素——而不是列表中每个父元素的子元素。
HTML 具有以下结构:
<form id="savedCartViewForm" action="/gp/cart/view.html/ref=ord_cart_shr?app-nav-type=none&dc=df" method="post">
<input type="hidden" value="1" name="fromAUI" />
<input type="hidden" value="4CPM1MKXXXXXZ" name="requestID" />
<input type="hidden" value="15XXXXXX0" name="timeStamp" />
<input type="hidden" value="gkAVhUvXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAAAFx2yhxAAA" name="token" />
<div class="a-divider a-divider-section">
<div class="a-row sc-list-head sc-java-remote-feature">
<div class="a-row sc-list-body sc-java-remote-feature">
<div class="a-row sc-list-item sc-list-item-border sc-java-remote-feature" data-quantity="4" data-price="8.99" data-previous-offer-id="ekOCOsC%2Bl7B8l5MNqXXXXXXXXXXXXXXXXXXXXXXXXXXbBFS5rQm%2BDi9cGGpFufHEITXWAr6tAjIiPTFbZiXjZyIce7Y" data-outofstock="0"
data-minquantity="1" data-itemtype="saved" data-itemislastpantryitem="0" data-itemid="S2e1cb5b5-ebb5-4e70-8474-c596d80bd99a" data-itemcategory="normal" data-item-count="1" data-isprimeasin="0" data-giftwrapped="0" data-giftable="0" data-encoded-offering="erF6bSsUaPN0XP13xfXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXYvWwmsZJ2HZwKuDJbLvjiR%2BI2CQAPyug7sPmmGV7DdJ"
data-best-offer-id="erF6bSsUaPN0XP13xfsXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXwmsZJ2HZwKuDJbLvjiR%2OezFaQg7sPmmGV7DdJ" data-asin="B0742J1KYD">
<div class="sc-list-item-spinner" style="display:none;">
<div class="sc-list-item-overwrap" style="display:none;" />
<div class="sc-list-item-removed-msg a-padding-medium" style="display:none;">
<div class="sc-list-item-content">
<div class="a-row a-spacing-base a-spacing-top-base">
<div class="a-column a-span10">
<div class="a-fixed-left-grid">
<div class="a-fixed-left-grid-inner" style="padding-left:115px">
<div class="a-fixed-left-grid-col a-float-left a-col-left" style="width:115px;margin-left:-115px;float:left;">
<div class="a-fixed-left-grid-col a-col-right" style="padding-left:0%;float:left;">
<ul class="a-unordered-list a-nostyle a-vertical a-spacing-mini">
<div class="a-row sc-action-links">
<span class="a-size-small sc-action-delete">
<span class="a-declarative" data-sc-item-action="{"itemID":"S2e1cbXXXXXXXXXXXXXXXXXXXXXXXXXXd80b9a","itemType":"saved","isWishListItem":0,"action":"delete","isFresh":0}" data-action="sc-item-action">
<input type="submit" aria-label="Delete MENSI Outdoor Patio Heater M6*0.75 Head Thread With M8X1 End Connection Nuts Thermocouple 410mm" value="Delete" name="submit.delete.S2XXXXXXXXXXXXXXXXXXXXXXXXXX0bd99a"/>
</span>
</span>
<i class="a-icon a-icon-text-separator" aria-label="|" role="img" />
<span class="a-size-small sc-action-add-best-offer sc-invisible-when-no-js">
<input class="wl-refdata" type="hidden" value="true" name="isSelectedForCheckout"/>
<i class="a-icon a-icon-text-separator" aria-label="|" role="img"/>
<span class="a-size-small sc-action-move-to-wishlist sc-invisible-when-no-js">
</div>
</div>
</div>
</div>
</div>
<div class="a-column a-span2 a-text-left a-span-last">
</div>
</div>
</div>
<div class="a-row sc-list-item sc-list-item-border sc-java-remote-feature" data-quantity="8" data-price="7.37" data-outofstock="0" data-minquantity="1" data-itemtype="saved" data-itemislastpantryitem="0" data-itemid="See02cb-XXXXXXXXXXXXXXXXXXXXXXXXXXc5" data-itemcategory="normal" data-item-count="2" data-isprimeasin="0" data-giftwrapped="0" data-giftable="0" data-encoded-offering="MzgFwAMDc3XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX4bqRzg7IzfFp%2B%2BDg%2BAYyl4X" data-asin="B004DYKIH4">
<div class="sc-list-item-spinner" style="display:none;">
<div class="sc-list-item-overwrap" style="display:none;"/>
<div class="sc-list-item-removed-msg a-padding-medium" style="display:none;">
<div class="sc-list-item-content">
<div class="a-row a-spacing-base a-spacing-top-base">
<div class="a-column a-span10">
<div class="a-fixed-left-grid">
<div class="a-fixed-left-grid-inner" style="padding-left:115px">
<div class="a-fixed-left-grid-col a-float-left a-col-left" style="width:115px;margin-left:-115px;float:left;">
<div class="a-fixed-left-grid-col a-col-right" style="padding-left:0%;float:left;">
<ul class="a-unordered-list a-nostyle a-vertical a-spacing-mini">
<div class="a-row sc-action-links">
<span class="a-size-small sc-action-delete">
<span class="a-declarative" data-sc-item-action="{"itemID":"SeccXXXXXXXXXXXXXXXXXXXXXXXXXXd441c5","itemType":"saved","isWishListItem":0,"action":"delete","isFresh":0}" data-action="sc-item-action">
<input type="submit" aria-label="Delete Bit Adapter - 1/4" to 1/4" - Turn Any Ratchet Into a Driver! Now with Quick-Change By Pro Tools" value="Delete" name="submit.delete.SeccXXXXXXXXXXXXXXXXXXXXXXXXXX5"/>
</span>
</span>
<i class="a-icon a-icon-text-separator" aria-label="|" role="img" />
<span class="a-size-small sc-action-move-to-cart">
<input class="wl-refdata" type="hidden" value="B003IXYJYO" name="creativeAsin"/>
<input class="wl-refdata" type="hidden" value="5BD74XXXXXXXXXXXXXXXXXXXXXXXXXX68" name="assocToken"/>
<input class="wl-refdata" type="hidden" value="xsc" name="linkCode"/>
<input class="wl-refdata" type="hidden" value="true" name="isSelectedForCheckout"/>
<i class="a-icon a-icon-text-separator" aria-label="|" role="img"/>
<span class="a-size-small sc-action-move-to-wishlist sc-invisible-when-no-js">
<i class="a-icon a-icon-text-separator" aria-label="|" role="img"/>
<span id="comparison-lite-modal-B004DYKIH4" class="a-declarative" data-a-modal="{"cache":"0","hideHeader":"true","width":"80%","ajaxFailMsg":"We\u2019re sorry, an error has occurred. Please try again.","url":"/compare/product/B004DYKIH4/ref=psdc_sXXXXB004DYKIH4?viewType=sfl","height":"570"}" data-action="a-modal">
</div>
</div>
</div>
</div>
</div>
<div class="a-column a-span2 a-text-left a-span-last">
</div>
</div>
</div>
根据我在 SO 上阅读的所有内容,上面的 XPath 应该可以工作。是什么导致了这个异常?
谢谢
更新:这里有几个我依赖的参考资料:
在 selenium 中定位 WebElements 的子节点
解决方案
我通过将我的更新XPath
为:
/descendant::input[@value = 'Delete']
我现在能够识别正确的元素。但是,我仍然不清楚为什么原来的XPath
不起作用,而这个起作用 - 因为根据几篇文章,我读到 '//' 是后代或自我的简写和 . 添加,以便搜索相对于父元素开始。所以这个原因对我来说仍然没有意义。
如果有人可以提供带有解释的更新答案,我将选择该答案作为问题的答案,而不是我自己的答案。
推荐阅读
- python - 我们如何使用 python 重置控制台的内容?
- c++ - 使用带有虚函数的类的构造函数进行大括号初始化
- ffmpeg - 我需要在 FFMpeg 中启用哪些编码器/解码器/复用器/解复用器/解析器/过滤器才能将 mp4 视频转换为 gif?
- c# - 如何在 .NET Core 库之间进行引用?
- xcode - 你在 Apple Developer Portal 中看到的 Xcode 的功能和 AppID 功能之间不应该存在 1-1 的关系吗?
- typescript - 对象中的打字稿泛型类
- sql - Teradata 查询优化
- ruby-on-rails - 如何在 Rails 中手动导致 ActiveRecord RecordInvalid
- java - 如何在 java 中打印以下结果?
- css - CSS 动画在 Firefox 上无法正常工作