C# selenium Chrome-WebDrive нажав кнопку, используя класс и заголовок

Я просто хочу нажать кнопку на моей странице. HTML-код выглядит так:

<tr ng-repeat="row in rowCollection" ng-class="{ &quot;error-row&quot;: row.errorMessage }" ng-style="vm.getColor(row)" class="ng-scope" style="background: rgb(255, 242, 255) none repeat scroll 0% 0%;">
    <td class="ng-binding">Wylaczenie nadan RDF</td><td class="ng-binding">WAITING_FOR_NOTIFICATION</td>
    <td>
        <a href="" ng-click="vm.showProcessDiagram(row.executor)" class="ng-binding">rfsSendingExecutor</a>
    </td>
    <td class="ng-binding">2017-09-06 11:14:12</td><td class="ng-binding">2017-09-06 11:14:13</td>
    <td has-role="REQUEST" class="text-center">
    <!-- ngIf: row.inXml || row.outXml -->
    <button ng-if="row.inXml || row.outXml" ng-click="vm.showXml(row)" title="Show" class="btn btn-xs ng-scope"><span class="fa fa-code"></span></button>
    <!-- end ngIf: row.inXml || row.outXml -->
    </td>
    <td has-role="ERROR" class="text-center"><button ng-show="row.errorMessage" ng-click="vm.showError(row.errorMessage)" title="Show" class="btn btn-xs ng-hide"><span class="fa fa-search"></span></button></td>
    <td class="text-center">
    <button ng-show="vm.enableCancel(row)" ng-click="vm.cancelTask(row.workItemId)" title="Cancel" class="btn btn-xs ng-hide">
        <span class="fa fa-ban text-warning"></span>
    </button> 
    <button ng-show="vm.enableRepeat(row)" ng-click="vm.repeatTask(row.id)" title="Repeat" class="btn btn-xs ng-hide">
        <span class="fa fa-refresh text-success"></span>
    </button> 
    <button ng-show="vm.enableRepeat(row)" ng-click="vm.repeatTaskWithParams(row.id)" title="Repeat with parameters" class="btn btn-xs ng-hide">
        <span class="fa fa-refresh text-warning"></span>
    </button>
    <button ng-show="vm.enableSkip(row)" ng-click="vm.skipTask(row.workItemId)" title="Skip" class="btn btn-xs">
        <span class="fa fa-angle-double-right text-success"></span>
    </button>
    </td>
</tr>

Все, что я хочу сделать, это нажать на эту кнопку:

<button ng-show="vm.enableSkip(row)" ng-click="vm.skipTask(row.workItemId)" title="Skip" class="btn btn-xs">
        <span class="fa fa-angle-double-right text-success"></span>

Я прошел через уроки по xpath и проверил много других сообщений на форумах. Я не уверен, что мне не хватает. Я просто пытаюсь найти следующий элемент по xpath, как это:

button_to_click= findElement(By.xpath("//button[@title='Skip']"));

но это не работает ВОПРОС: Почему это не работает только по названию? Я пытаюсь по-другому и делаю так:

 button_to_click= findElement(By.xpath("//button[@class='btn btn-xs']"));

И это хорошо работает, но когда у меня есть 3 или 4 элемента в этом классе, просто нажмите неправильную кнопку. Как я могу нажать точно эту кнопку, кто-то может мне помочь?
Может быть, я попробую что-нибудь подобное?

button_to_click= findElement(By.xpath("//button[@class='btn btn-xs']//button[@title='Skip']"));

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

РЕДАКТИРОВАТЬ 1 Я добавляю больше кода, как вы хотите знать, что я делаю.: Этот код работает хорошо:

driver = new ChromeDriver();
driver.url ="http://mypage.com"
button_to_click= findElement(By.xpath("//button[@class='btn btn-xs']")).Click();

И этот код не работает:

driver = new ChromeDriver();
driver.url ="http://mypage.com"
button_to_click= findElement(By.xpath("//button[@title='Skip']")).Click();

РЕДАКТИРОВАТЬ 2 Я дам вам пример страницы для тестирования. Вам просто нужно скачать HTML-файл и открыть его в браузере. HTML-файл страницы Что мы теперь хотим сделать? Если вы запустите этот HTML-файл, вы увидите всю страницу. И теперь мы хотим сделать клик по этой кнопке на экране: После того, как вы нажмете на эту кнопку, вы увидите счетчик кликов ниже: вот так: Кто-нибудь знает, как это нажать? Я пробую несколько способов и не могу найти решение до сих пор. Пожалуйста помоги.

РЕДАКТИРОВАТЬ 3

Я стараюсь также: - но это тоже не работает

drive.FindElement(By.XPath("//tr[class='ng-scope']/td[text()='Wylaczenie nadan RDF'] and button[@title='Skip'']]")).Click();

2 ответа

Решение

Согласно вашему Вопросу, эта строка кода работает:

button_to_click= findElement(By.xpath("//button[@class='btn btn-xs']")).Click();

Эта строка кода не работает:

button_to_click= findElement(By.xpath("//button[@title='Skip']")).Click();

Объяснение:

Глядя на HTML DOM понятно WebApplication использует много JavaScript & Ajax Calls, Отсюда и атрибуты, например ng-repeat, ng-class и т.д. с динамическими значениями, например { &quot;error-row&quot;: row.errorMessage }, vm.showError(row.errorMessage) и т.д. Поэтому будет сложно использовать эти значения / атрибуты для построения xpath или же CSSselector

С помощью xpath как //button[@title='Skip'] должен был работать при условии xpath однозначно определены конкретные элементы нашего интереса. Но так как этого не происходит, я подозреваю, что может быть несколько элементов, соответствующих этому xpath где некоторые из них могут быть отключены / скрыты. Итак xpath с использованием title приписывать как SkipFAILED,

С помощью xpath как //button[@class='btn btn-xs'] работает без сбоев, потому что здесь мы рассмотрели class атрибут, который широко используется в CSSselector а также внутри xpath который отображается вниз на querySelector/querySelectorAll. Следовательно, этот вариант более надежен и работает идеально.

Обновить:

Хотя используя xpath как //button[@class='btn btn-xs'] работает для вас без каких-либо ошибок, я не уверен, почему вы хотите избежать этого. О xpath Вы упомянули в своем комментарии, так как у вас есть много деталей в поиске, используя <button> тэг кажется ненужным ссылаться на любой родительский узел, например tr[text()='Wylaczenie nadan RDF'], В случае xpath как //button[@class='btn btn-xs'] не идентифицирует элемент однозначно вы можете рассмотреть, чтобы клуб до class а также title атрибут следующим образом:

button_to_click= findElement(By.xpath("//button[@class='btn btn-xs' and @title='Skip']")).Click();

Мне любопытно, если у вас есть элемент выше в dom с теми же атрибутами и HTML-элементами, что и XPath, который вы пытаетесь выбрать. Давайте разберемся с нашим XPath и добавим некоторые условия. Дайте этому парню шанс:

//button[@ng-show='vm.enableSkip(row)' and @title='Skip' and @class='btn btn-xs']

Если вам нужно добавить еще больше идентификаторов, продолжайте добавлять их туда. Нет ничего плохого в том, чтобы иметь очень конкретные XPath.

Также похоже, что ваша кнопка находится в строке таблицы. Если в элементе tr, который содержит кнопку, есть что-то уникальное, вы обязательно должны добавить это в xpath перед кнопкой, и вам не нужно беспокоиться об этом, нажимая кнопку в предыдущем элементе tr, и при этом вы знаете, что не нужно ничего больше, чем @title='Skip' для вашей уникальности в кнопочной части XPath.

Например...

//tr[@attribute='uniqueTRValue']/button[@title='Skip']
Другие вопросы по тегам