Reputation: 786
I have the following HTML snippet:
<div class="a-row a-spacing-micro">
<div class="a-column a-span4 a-spacing-none a-spacing-top-mini address-column">
<div id="ya-myab-display-address-block-2" class="a-box a-spacing-none normal-desktop-address-tile">
<div class="a-box-inner a-padding-none">
<div class="a-section address-section-no-default">
<div class="a-row a-spacing-small">
<ul class="a-unordered-list a-noStyle a-vertical">
<li>
<span class="a-list-item">
<h5 id="address-ui-widgets-FullName" class="id-addr-ux-search-text a-text-bold">XXX XXXXX</h5>
</span>
</li>
<li>
<span class="a-list-item">
<span id="address-ui-widgets-AddressLineOne" class="id-addr-ux-search-text">DDD XXXX XX</span>
</span>
</li>
<li>
<span class="a-list-item">
<span id="address-ui-widgets-CityXXatePoXXalCode" class="id-addr-ux-search-text">XXXXXXXX, XX DDDDD-DDDD</span>
</span>
</li>
<li>
<span class="a-list-item">
<span id="address-ui-widgets-Country" class="id-addr-ux-search-text">United States</span>
</span>
</li>
<li>
<span class="a-list-item">
<span id="address-ui-widgets-PhoneNumber" class="id-addr-ux-search-text">Phone number: DDDDDDDDDD</span>
</span>
</li>
</ul>
<script>P.when('A', 'ready').execute(function(A) { var $ = A.$; var localizedXXrings = A.XXate('address-ui-widgets-XXore-map-text-id'); $(".address-ui-widgets-map-link").click(function(event) { event.preventDefault(); window.open(this.href, localizedXXrings["address_ui_widgets_XXore_address_map_header"], "width=600,height=450"); }) }); </script>
</div>
</div>
</div>
</div>
<div id="ya-myab-edit-address-desktop-row-2" class="a-row edit-address-desktop-link">
<a id="ya-myab-address-edit-btn-2" class="a-link-normal" href="/a/addresses/edit?ref=ya_address_book_edit_button&addressID=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX">Edit </a>
|
<a id="ya-myab-address-delete-btn-2" class="a-link-normal" href="#">
<span class="a-declarative" data-a-modal="{"name":"deleteAddressModal-2","width":"400","header":"Confirm Deletion"}" data-action="a-modal">Delete</span>
<div id="a-popover-deleteAddressModal-2" class="a-popover-preload">
<div class="a-section">
<div class="a-row a-spacing-small">
<ul class="a-unordered-list a-noStyle a-vertical">
<li>
<span class="a-list-item">
<h5 id="address-ui-widgets-FullName" class="id-addr-ux-search-text a-text-bold">XXX XXXXX</h5>
</span>
</li>
<li>
<span class="a-list-item">
<span id="address-ui-widgets-AddressLineOne" class="id-addr-ux-search-text">DDD XXXX XX</span>
</span>
</li>
<li>
<span class="a-list-item">
<span id="address-ui-widgets-CityXXatePoXXalCode" class="id-addr-ux-search-text">XXXXXXXX, XX DDDDD-DDDD</span>
</span>
</li>
<li>
<span class="a-list-item">
<span id="address-ui-widgets-Country" class="id-addr-ux-search-text">United States</span>
</span>
</li>
<li>
<span class="a-list-item">
<span id="address-ui-widgets-PhoneNumber" class="id-addr-ux-search-text">Phone number: 3472631425</span>
</span>
</li>
</ul>
<script>P.when('A', 'ready').execute(function(A) { var $ = A.$; var localizedXXrings = A.XXate('address-ui-widgets-XXore-map-text-id'); $(".address-ui-widgets-map-link").click(function(event) { event.preventDefault(); window.open(this.href, localizedXXrings["address_ui_widgets_XXore_address_map_header"], "width=600,height=450"); }) }); </script>
</div>
<div class="a-row a-spacing-small">
<span class="a-size-small a-color-tertiary">
<span class="a-text-bold">Please note: </span>
Deleting this address will not delete any pending orders being shipped to this address. To ensure uninterrupted fulfillment of future orders, please update any wishliXXs, subscribe and save settings and periodical subscriptions using this address.
</span>
</div>
<div class="a-row a-spacing-none">
<hr class="a-divider-normal"/>
</div>
<div class="a-row">
<div class="a-column a-span6">
<div class="a-row">
<div class="a-column a-span3"/>
<div class="a-column a-span8">
<span id="deleteAddressModal-2-cancel-btn" class="a-button a-button-span12">
<span class="a-button-inner">
<button id="deleteAddressModal-2-cancel-btn-announce" class="a-button-text" type="button">No</button>
</span>
</span>
</div>
</div>
</div>
<div class="a-column a-span6 a-span-laXX">
<div class="a-row">
<div class="a-column a-span1"/>
<div class="a-column a-span8">
<form class="a-spacing-none" action="/a/addresses/delete" method="poXX">
<input type="hidden" value="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" name="addressID"/>
<input type="hidden" value="false" name="isXXoreAddress"/>
<input type="hidden" value="XXXXXXXXXXXXXXXXXXXXXXX" name="csrfToken"/>
<span id="deleteAddressModal-2-submit-btn" class="a-button a-button-span12 a-button-primary">
<span class="a-button-inner">
<input class="a-button-input" type="submit" aria-labelledby="deleteAddressModal-2-submit-btn-announce"/>
<span id="deleteAddressModal-2-submit-btn-announce" class="a-button-text" aria-hidden="true">Yes</span>
</span>
</span>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</a>
<form class="set-address-default" action="/a/addresses/set-default-address?ref=ya_address_book_set_default_button" method="poXX">
<input type="hidden" value="XXXXXXXXXXXXXXXXXXXXXXX" name="csrfToken"/>
<input type="hidden" value="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" name="addressID"/>
|
<a id="ya-myab-set-default-shipping-btn-2" class="a-link-normal" href="#">Set as Default</a>
</form>
</div>
</div>
<div class="a-column a-span4 a-spacing-none a-spacing-top-mini address-column">
<div id="ya-myab-display-address-block-3" class="a-box a-spacing-none normal-desktop-address-tile">
<div class="a-box-inner a-padding-none">
<div class="a-section address-section-no-default">
<div class="a-row a-spacing-small">
<ul class="a-unordered-list a-noStyle a-vertical">
<li>
<span class="a-list-item">
<h5 id="address-ui-widgets-FullName" class="id-addr-ux-search-text a-text-bold">XXXXXXX XXXXX</h5>
</span>
</li>
<li>
<span class="a-list-item">
<span id="address-ui-widgets-AddressLineOne" class="id-addr-ux-search-text">DDD XXXX XX</span>
</span>
</li>
<li>
<span class="a-list-item">
<span id="address-ui-widgets-CityXXatePoXXalCode" class="id-addr-ux-search-text">XXXXXXXX, XX DDDDD</span>
</span>
</li>
<li>
<span class="a-list-item">
<span id="address-ui-widgets-Country" class="id-addr-ux-search-text">United States</span>
</span>
</li>
<li>
<span class="a-list-item">
<span id="address-ui-widgets-PhoneNumber" class="id-addr-ux-search-text">Phone number: 3472631425</span>
</span>
</li>
</ul>
<script>P.when('A', 'ready').execute(function(A) { var $ = A.$; var localizedXXrings = A.XXate('address-ui-widgets-XXore-map-text-id'); $(".address-ui-widgets-map-link").click(function(event) { event.preventDefault(); window.open(this.href, localizedXXrings["address_ui_widgets_XXore_address_map_header"], "width=600,height=450"); }) }); </script>
</div>
</div>
</div>
</div>
<div id="ya-myab-edit-address-desktop-row-3" class="a-row edit-address-desktop-link">
<a id="ya-myab-address-edit-btn-3" class="a-link-normal" href="/a/addresses/edit?ref=ya_address_book_edit_button&addressID=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX">Edit </a>
|
<a id="ya-myab-address-delete-btn-3" class="a-link-normal" href="#">
<span class="a-declarative" data-a-modal="{"name":"deleteAddressModal-3","width":"400","header":"Confirm Deletion"}" data-action="a-modal">Delete</span>
<div id="a-popover-deleteAddressModal-3" class="a-popover-preload">
<div class="a-section">
<div class="a-row a-spacing-small">
<ul class="a-unordered-list a-noStyle a-vertical">
<li>
<span class="a-list-item">
<h5 id="address-ui-widgets-FullName" class="id-addr-ux-search-text a-text-bold">XXXXXXX XXXXX</h5>
</span>
</li>
<li>
<span class="a-list-item">
<span id="address-ui-widgets-AddressLineOne" class="id-addr-ux-search-text">DDD XXXX XX</span>
</span>
</li>
<li>
<span class="a-list-item">
<span id="address-ui-widgets-CityXXatePoXXalCode" class="id-addr-ux-search-text">XXXXXXXX, XX DDDDD</span>
</span>
</li>
<li>
<span class="a-list-item">
<span id="address-ui-widgets-Country" class="id-addr-ux-search-text">United States</span>
</span>
</li>
<li>
<span class="a-list-item">
<span id="address-ui-widgets-PhoneNumber" class="id-addr-ux-search-text">Phone number: DDDDDDDDDD</span>
</span>
</li>
</ul>
<script>P.when('A', 'ready').execute(function(A) { var $ = A.$; var localizedXXrings = A.XXate('address-ui-widgets-XXore-map-text-id'); $(".address-ui-widgets-map-link").click(function(event) { event.preventDefault(); window.open(this.href, localizedXXrings["address_ui_widgets_XXore_address_map_header"], "width=600,height=450"); }) }); </script>
</div>
<div class="a-row a-spacing-small">
<span class="a-size-small a-color-tertiary">
<span class="a-text-bold">Please note: </span>
Deleting this address will not delete any pending orders being shipped to this address. To ensure uninterrupted fulfillment of future orders, please update any wishliXXs, subscribe and save settings and periodical subscriptions using this address.
</span>
</div>
<div class="a-row a-spacing-none">
<hr class="a-divider-normal"/>
</div>
<div class="a-row">
<div class="a-column a-span6">
<div class="a-row">
<div class="a-column a-span3"/>
<div class="a-column a-span8">
<span id="deleteAddressModal-3-cancel-btn" class="a-button a-button-span12">
<span class="a-button-inner">
<button id="deleteAddressModal-3-cancel-btn-announce" class="a-button-text" type="button">No</button>
</span>
</span>
</div>
</div>
</div>
<div class="a-column a-span6 a-span-laXX">
<div class="a-row">
<div class="a-column a-span1"/>
<div class="a-column a-span8">
<form class="a-spacing-none" action="/a/addresses/delete" method="poXX">
<input type="hidden" value="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" name="addressID"/>
<input type="hidden" value="false" name="isXXoreAddress"/>
<input type="hidden" value="XXXXXXXXXXXXXXXXXXXXXXX" name="csrfToken"/>
<span id="deleteAddressModal-3-submit-btn" class="a-button a-button-span12 a-button-primary">
<span class="a-button-inner">
<input class="a-button-input" type="submit" aria-labelledby="deleteAddressModal-3-submit-btn-announce"/>
<span id="deleteAddressModal-3-submit-btn-announce" class="a-button-text" aria-hidden="true">Yes</span>
</span>
</span>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</a>
<form class="set-address-default" action="/a/addresses/set-default-address?ref=ya_address_book_set_default_button" method="poXX">
<input type="hidden" value="XXXXXXXXXXXXXXXXXXXXXXX" name="csrfToken"/>
<input type="hidden" value="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" name="addressID"/>
|
<a id="ya-myab-set-default-shipping-btn-3" class="a-link-normal" href="#">Set as Default</a>
</form>
</div>
</div>
<div class="a-column a-span4 a-spacing-none a-spacing-top-mini address-column a-span-laXX">
<div id="ya-myab-display-address-block-4" class="a-box a-spacing-none normal-desktop-address-tile">
<div class="a-box-inner a-padding-none">
<div class="a-section address-section-no-default">
<div class="a-row a-spacing-small">
<ul class="a-unordered-list a-noStyle a-vertical">
<li>
<span class="a-list-item">
<h5 id="address-ui-widgets-FullName" class="id-addr-ux-search-text a-text-bold">XXXXXXX XXXXX</h5>
</span>
</li>
<li>
<span class="a-list-item">
<span id="address-ui-widgets-AddressLineOne" class="id-addr-ux-search-text">DDD XXXX XX</span>
</span>
</li>
<li>
<span class="a-list-item">
<span id="address-ui-widgets-CityXXatePoXXalCode" class="id-addr-ux-search-text">XXXXXXXX, XX DDDDD</span>
</span>
</li>
<li>
<span class="a-list-item">
<span id="address-ui-widgets-Country" class="id-addr-ux-search-text">United States</span>
</span>
</li>
</ul>
<script>P.when('A', 'ready').execute(function(A) { var $ = A.$; var localizedXXrings = A.XXate('address-ui-widgets-XXore-map-text-id'); $(".address-ui-widgets-map-link").click(function(event) { event.preventDefault(); window.open(this.href, localizedXXrings["address_ui_widgets_XXore_address_map_header"], "width=600,height=450"); }) }); </script>
</div>
</div>
</div>
</div>
<div id="ya-myab-edit-address-desktop-row-4" class="a-row edit-address-desktop-link">
<a id="ya-myab-address-edit-btn-4" class="a-link-normal" href="/a/addresses/edit?ref=ya_address_book_edit_button&addressID=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX">Edit </a>
|
<a id="ya-myab-address-delete-btn-4" class="a-link-normal" href="#">
<span class="a-declarative" data-a-modal="{"name":"deleteAddressModal-4","width":"400","header":"Confirm Deletion"}" data-action="a-modal">Delete</span>
<div id="a-popover-deleteAddressModal-4" class="a-popover-preload">
<div class="a-section">
<div class="a-row a-spacing-small">
<ul class="a-unordered-list a-noStyle a-vertical">
<li>
<span class="a-list-item">
<h5 id="address-ui-widgets-FullName" class="id-addr-ux-search-text a-text-bold">XXXXXXX XXXXX</h5>
</span>
</li>
<li>
<span class="a-list-item">
<span id="address-ui-widgets-AddressLineOne" class="id-addr-ux-search-text">DDD XXXX XX</span>
</span>
</li>
<li>
<span class="a-list-item">
<span id="address-ui-widgets-CityXXatePoXXalCode" class="id-addr-ux-search-text">XXXXXXXX, XX DDDDD</span>
</span>
</li>
<li>
<span class="a-list-item">
<span id="address-ui-widgets-Country" class="id-addr-ux-search-text">United States</span>
</span>
</li>
</ul>
<script>P.when('A', 'ready').execute(function(A) { var $ = A.$; var localizedXXrings = A.XXate('address-ui-widgets-XXore-map-text-id'); $(".address-ui-widgets-map-link").click(function(event) { event.preventDefault(); window.open(this.href, localizedXXrings["address_ui_widgets_XXore_address_map_header"], "width=600,height=450"); }) }); </script>
</div>
<div class="a-row a-spacing-small">
<span class="a-size-small a-color-tertiary">
<span class="a-text-bold">Please note: </span>
Deleting this address will not delete any pending orders being shipped to this address. To ensure uninterrupted fulfillment of future orders, please update any wishliXXs, subscribe and save settings and periodical subscriptions using this address.
</span>
</div>
<div class="a-row a-spacing-none">
<hr class="a-divider-normal"/>
</div>
<div class="a-row">
<div class="a-column a-span6">
<div class="a-row">
<div class="a-column a-span3"/>
<div class="a-column a-span8">
<span id="deleteAddressModal-4-cancel-btn" class="a-button a-button-span12">
<span class="a-button-inner">
<button id="deleteAddressModal-4-cancel-btn-announce" class="a-button-text" type="button">No</button>
</span>
</span>
</div>
</div>
</div>
<div class="a-column a-span6 a-span-laXX">
<div class="a-row">
<div class="a-column a-span1"/>
<div class="a-column a-span8">
<form class="a-spacing-none" action="/a/addresses/delete" method="poXX">
<input type="hidden" value="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" name="addressID"/>
<input type="hidden" value="false" name="isXXoreAddress"/>
<input type="hidden" value="XXXXXXXXXXXXXXXXXXXXXXX" name="csrfToken"/>
<span id="deleteAddressModal-4-submit-btn" class="a-button a-button-span12 a-button-primary">
<span class="a-button-inner">
<input class="a-button-input" type="submit" aria-labelledby="deleteAddressModal-4-submit-btn-announce"/>
<span id="deleteAddressModal-4-submit-btn-announce" class="a-button-text" aria-hidden="true">Yes</span>
</span>
</span>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</a>
<form class="set-address-default" action="/a/addresses/set-default-address?ref=ya_address_book_set_default_button" method="poXX">
<input type="hidden" value="XXXXXXXXXXXXXXXXXXXXXXX" name="csrfToken"/>
<input type="hidden" value="XXXXXXXXXXXXXXXXXXXXXXX" name="addressID"/>
|
<a id="ya-myab-set-default-shipping-btn-4" class="a-link-normal" href="#">Set as Default</a>
</form>
</div>
</div>
</div>
Which roughly corresponds to the following layout/design:
As seen in above image, each box contains a name and address with the option to Edit, Delete or Set as Default.
Given only the address or name - how can I click "Set as Default" for the corresponding address (or name)?
So far the only working XPath is based on chaining several /parent::*/
expressions as seen below.
.//*[contains (text(),'123 XYZ AVE')]/parent::*/parent::*/parent::*/parent::*/parent::*/parent::*/parent::*/parent::*/form/input (selects based on address)
.//*[contains (text(),'NAME')]/parent::*/parent::*/parent::*/parent::*/parent::*/parent::*/parent::*/parent::*/form/input (selects based on name)
What the previous expressions do is they tell Selenium to find the name or address (.//*[contains (text(),'NAME')]
) and then move up/backwards several levels until reaching the element that contains all child elements (which includes the Edit, Delete and Set as Default options) and then find the element with /form/input
value.
While this works, it is awfully large and unwieldy and prone to break if the structure/number of any of the parent elements change.
How can I simplify this expression so that given an address or name (assuming all addresses/names are unique) I could identify and click the related "Set as Default" option without climbing up the hierarchy?
Thanks!
Upvotes: 1
Views: 638
Reputation: 13712
Firstly find the whole address section belongs to one person by person name, then find Edit/Delete/Set as Default
button inside the section:
private WebElement findAddressSection(customerName) {
String xpathExp = "//div[contains(@class, 'a-column a-span4')]" +
"[div//h5[text()='"+ customerName+"']]";
return driver.findElement(By.xpath(xpathExp));
}
public void clickAddressEditBtn(customerName) {
WebElement section = findAddressSection(customerName);
section.findElement(By.cssSelector("a[id*='ya-myab-address-edit-btn']"))
.click();
}
public void clickAddressDeleteBtn(customerName) {
WebElement section = findAddressSection(customerName);
section.findElement(By.cssSelector("a[id*='ya-myab-address-delete-btn']"))
.click();
}
public void clickAddressSetDefaultBtn(customerName) {
WebElement section = findAddressSection(customerName);
section.findElement(By.cssSelector("a[id*='ya-myab-set-default-shipping-btn']"))
.click();
}
Upvotes: 2
Reputation: 12672
The sample HTML contains several errors (duplicate IDs, etc.), but the xpath below should help to get the value
'//*[contains(.,"abcdert")]/descendant::form/input'
Upvotes: 1