Попытка найти уникальный xpath кнопки

У меня есть случай, когда XPath не уникален и соответствует 3 элементам на странице, элементарная позиция которых изменяется при обновлении:

 <div class="col-xs-12   Hover">
    <button data-testid="continueCheckoutButton" ng- 
    class="continueDellMetricsClass" ng-click="continueButtonClick()" ng- 
    disabled="disableContinueButton" class="btn btn-success btn-block 
    continueButton" data-metrics="" type="button">Checkout</button>

Пожалуйста, помогите мне найти уникальный путь XPath или CSS для этого элемента кнопки.

Два других HTML выглядят следующим образом:

<div class="col-xs-12">
    <button data-testid="continueCheckoutButton" ng- 
    class="continueDellMetricsClass" ng-click="continueButtonClick()" ng- 
    disabled="disableContinueButton" class="btn btn-success btn-block 
    continueButton" data-metrics="" type="button" style="background: 
    rgb(204, 136, 136); border: 2px solid red;">Checkout</button>

     <div>
                <button ng-class="continueDellMetricsClass" ng- 
      click="continueButtonClick()" ng-disabled="disableContinueButton" 
      class="btn btn-success btn-block continueButton" data- 
      testid="continueCheckoutButton" data-metrics="" type="button" 
      style="background: rgb(204, 136, 136); border: 2px solid 
       red;">Checkout</button>
            </div>

Вот что приводит к совпадению трех элементов:

   //button[@data-testid = 'continueCheckoutButton']

Пожалуйста помоги!

Можете ли вы поделиться HTML для всех 3 кнопок?

Andersson 11.04.2018 13:35

да, перед тем, как давать ответы, требуется HTML-код всех 3-х кнопок.

cruisepandey 11.04.2018 13:43

@ user3121891 Поскольку HTML содержит несколько тегов <button> с похожими атрибутами, чтобы найти конкретный тег <button>, вам нужно обновить вопрос с помощью соответствующего HTML, по которому мы можем отличить желаемый элемент от других и помочь вам получить Стратегия поиска, который будет идентифицировать ваш желаемый элемент.

DebanjanB 11.04.2018 13:50

Я только что обновил описание, пожалуйста. спасибо за ваше время, братан

user3121891 11.04.2018 13:52

@ user3121891, проверьте мой ответ, пожалуйста.

Ratmir Asanov 11.04.2018 13:55
1
5
664
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Чтобы нажать кнопку с текстом Проверить, вы должны вызвать ожидание через WebDriverWait, и вы можете использовать любой из следующих блоков кода (Python):

  • CSS_SELECTOR:

    button.btn.btn-success.btn-block.continueButton[ng-class='continueDellMetricsClass'][data-testid='continueCheckoutButton']
    
  • XPATH:

    //button[@class='btn btn-success btn-block continueButton' and contains(.,'Checkout')]
    

Примечание: Поскольку элемент является элементом Угловой, вы должны вызвать правильный WebDriverWait через ваш соответствующий Искусство связывания с селеновым языком.


Обновлять

Согласно вашему обновленному HTML вы можете использовать следующий Стратегия поиска:

  • XPATH:

    //button[@class='btn btn-success btn-block continueButton' and contains(.,'Checkout') and not (@style='background')]
    

Спасибо Дебанджану за ответ. Я пробовал этот xpath, но опять же это происходит из двух элементов. один находится на странице, а другой скрыт, но средство проверки xpath показывает два результата. :(

user3121891 11.04.2018 13:38

Попробуйте обновленный ответ с помощью CSS и обновите мне статус.

DebanjanB 11.04.2018 13:40

Не зная адреса всех трех кнопок, вы не сможете написать уникальный локатор.

cruisepandey 11.04.2018 13:44

@ user3121891 Ознакомьтесь с моим обновлением ответов и сообщите мне статус

DebanjanB 11.04.2018 14:12
//div[@class='col-xs-12']/button[@class='btn btn-success btn-block continueButton' and contains(.,'Checkout')]

Попробуй это.

@ user3121891 добавьте свои комментарии, если не работает для вас

gaurav chaudhary 12.04.2018 10:13
Ответ принят как подходящий

Чтобы отличить целевую кнопку от двух других, вы можете попробовать:

//button[not(@style) and .="Checkout"]

P.S. Если HTML для всех узлов кажется идентичным, вы можете использовать индекс нужного:

(//button[not(@style) and .="Checkout"])[1]

Обратите внимание, что в XPath индексация начинается с 1, поэтому индекс для первого узла будет [1].

Вы также можете использовать find_elements...() вместо find_element...(), чтобы получить список элементов и выбрать необходимые с помощью [index].

Думаю, я бы пошел с индексацией, и поскольку есть совпадение трех элементов, в моем случае моя проблема решается с помощью (// button [. = 'Checkout']) [3]. Я приму этот ответ. Спасибо, Андерссон!

user3121891 11.04.2018 14:38

Другие вопросы по теме