java—如何单击没有任何唯一类属性的按钮

4dc9hkyq  于 2021-07-12  发布在  Java
关注(0)|答案(4)|浏览(303)

我在点击一个按钮时遇到了麻烦,这个按钮有一个长的、生成的类,而这个类在使用xpath选择器时不是唯一的。它有两个嵌套元素-svg和span。我不确定我是否应该使用它们来查找这个按钮,或者可能按类查找并选择第二个选项。
我尝试了以下选择器:

xpath = "//button[contains(@class, 'styled_ShareButton')](1)"
xpath = "//button span[contains('Add to favorites')]"
xpath = "//button[contains(@span, 'fa-heart')]"
xpath = "//svg[contains(@class, 'fa-heart')]"

但都没用。
这是我感兴趣的按钮(这是同一类的两个按钮中的第二个)

<button class="styled__ShareButton-sc-1jdjzg3-3 feqRzW Button-sc-1emfup8-0 kFlIhg">
<svg aria-hidden="true" data-prefix="far" data-icon="heart" class="svg-inline--fa fa-heart fa-w-16 " role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor"></path></svg>
<span>Add to favourites</span>
</button>

有人能告诉我怎么点击它或者指出我在以前的选择器中犯的错误吗?谢谢。

vqlkdk9b

vqlkdk9b1#

您可以尝试以下XPath:

xPath = "//span[contains(text(), 'Add to favourites')]//parent::button"

xPath = "(//*[@id='react-app-root']//button[contains(@class, 'styled__ShareButton')])[last()]"

xPath = "//*[@id='react-app-root']//span[contains(text(), 'Add to favourites')]//parent::button"

xPath = "(//*[@id='react-app-root']//button[contains(@class, 'styled__ShareButton')])[2]"

xPath = "(//button[contains(@class, 'styled__ShareButton')])[2]"

xPath = "(//button[contains(@class, 'styled__ShareButton')])[last()]"
mkh04yzy

mkh04yzy2#

浏览器建议的默认xpath有效:

xpath = "//*[@id=\'react-app-root\']/div/div/div[2]/div/div[1]/button[2]"

但如果有人有更好的解决方案,我还是会很感激的。

j8ag8udp

j8ag8udp3#

这似乎是一个完美的数据属性用例。
该属性可用于唯一标识测试中的按钮,并且对ui结构中的更改更有弹性。

kcrjzv8t

kcrjzv8t4#

所需的元素是一个动态元素,因此要定位该元素,您必须诱导webdriverwait使该元素可单击,并且您可以使用以下任一解决方案: cssSelector :

new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("button[class^='styled__ShareButton-sc-'] span"))).click();
``` `xpath` :

new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//button[@class]//span[text()='Add to favourites']"))).click();

相关问题