C# selenium Chrome-WebDrive нажав кнопку, используя класс и заголовок
Я просто хочу нажать кнопку на моей странице. HTML-код выглядит так:
<tr ng-repeat="row in rowCollection" ng-class="{ "error-row": 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
и т.д. с динамическими значениями, например { "error-row": row.errorMessage }
, vm.showError(row.errorMessage)
и т.д. Поэтому будет сложно использовать эти значения / атрибуты для построения xpath
или же CSSselector
С помощью xpath
как //button[@title='Skip']
должен был работать при условии xpath
однозначно определены конкретные элементы нашего интереса. Но так как этого не происходит, я подозреваю, что может быть несколько элементов, соответствующих этому xpath
где некоторые из них могут быть отключены / скрыты. Итак xpath
с использованием title
приписывать как Skip
FAILED
,
С помощью 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']