Селен | Как отличить два одинаковых идентификатора

#selenium

Вопрос:

На внешнем веб — сайте я пытаюсь нажать кнопку «Сохранить». Но кнопка отмены имеет тот же класс.

 buttonSave = browser.find_element_by_class_name("_spectrum-Button_7a745")
buttonSave.click()
 

HTML :

 <button class="_spectrum-Button_7a745 _spectrum-Button--secondary_7a745 _spectrum-ButtonGroup-Button_25328" type="button" data-testid="cancel-button">
  <span class="_spectrum-Button-label_7a745">Cancel</span>
</button>
<span class="_spectrum-Button-label_7a745">Cancel</span>

<button class="_spectrum-Button_7a745 _spectrum-Button--cta_7a745 _spectrum-ButtonGroup-Button_25328" type="button" data-testid="cta-button">
  <span class="_spectrum-Button-label_7a745">Save</span>
</button>
<span class="_spectrum-Button-label_7a745">Save</span>
 

Комментарии:

1. Я вставил разрывы строк в ваш HTML — код-вы уверены, что для каждой кнопки есть две одинаковые метки?

Ответ №1:

В этом случае вы можете подать text based xpath заявку .

 //span[text()='Save']/parent::button
 

В HTML-файле, которым вы поделились, в основном два сохраненных текста. Таким образом, когда мы просто пишем xpath на основе текста, который является //span[text()='Save'] , мы все равно останемся без двух узлов. поэтому для дальнейшего различения мы должны использовать родительский узел, который является кнопкой, поэтому мы используем parent::button

PS: xpath на основе текста следует использовать только в том случае, если инженер по автоматизации знает, что веб-сайт будет на определенном языке. в данном случае, например, для английского языка.

Также в случае , если вы ищете css_selector , приведенное ниже должно выполнить свою работу.

 button[data-testid='cta-button']
 

Код с использованием xpath :

 buttonSave = browser.find_element_by_xpath("//span[text()='Save']/parent::button")
buttonSave.click()
 

Код с использованием css_selector :

 buttonSave = browser.find_element_by_css_selector("button[data-testid='cta-button']")
buttonSave.click()