Как нажать кнопку без какого-либо уникального атрибута класса - PullRequest
0 голосов
/ 04 февраля 2019

У меня проблемы с нажатием на кнопку с длинным сгенерированным классом, который не уникален при использовании селекторов xpath.Имеет 2 вложенных элемента - svg и span.Я не уверен, должен ли я искать эту кнопку, используя их или, возможно, просматривая класс и выбирая, например, 2-й вариант.

Я пробовал следующие селекторы:

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')]"

Но ни один из них не работал.

Вот кнопка, которая мне интересна (это вторая из 2 кнопок того же класса)

<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>

Может кто-нибудь сказать мне, как нажать на нее или, возможно, указать наошибка, которую я сделал в предыдущих селекторах?Спасибо.

Ответы [ 4 ]

0 голосов
/ 04 февраля 2019

Требуемый элемент является динамическим элементом, поэтому для нахождения элемента необходимо вызвать 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();
    
0 голосов
/ 04 февраля 2019

Это похоже на идеальный вариант использования атрибута данных .

Атрибут может использоваться для уникальной идентификации кнопки в тесте и будет более устойчивым к изменениям в вашемСтруктура пользовательского интерфейса.

0 голосов
/ 04 февраля 2019

Вы можете попробовать следующие 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()]"
0 голосов
/ 04 февраля 2019

Стандартный путь xpath, предложенный браузером, сработал:

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

, но если у кого-то есть более привлекательное решение, я все равно буду признателен за это.

...