Как перейти по ссылке, которая содержит переменную в атрибуте href?

Я пишу приемочные тесты, используя Selenium + WebdriverIO. И у меня есть некоторые проблемы с этим - я не могу перейти по этой ссылке

client.click('a[href=#admin/'+ transactionId + ']')

transactionId - это переменная, которая содержит ID транзакции. Мой HTML-код:

 <div class="ui-data-table">
<thead>...</thead>
<tbody>
<tr><td class="tac">
  <span class="tooltip" title="Transaction"><i class="icon-transaction"></i></span>


</td>
<td class="tac no-break">Today 10:23</td>
<td class="break-all"></td>
<td class="tac">
    N/A
</td>
<td>Artem</td>
<td class="tac">
  <span class="tooltip" title="Pending">

    <i class="icon-clock"></i>


  </span>
</td>
<td class="break-all">Artem Arsenowitch</td>
<td class="tac">
    <a href="#admin/aceb3f65-4078-4f47-8850-95ac9135fad3"><i class="icon-arrow-circle-right"></i></a>
</td></tr>
<tr>...</tr>
<tr>...</tr>
<tr>...</tr>
<tr>...</tr>
<tr>...</tr>
<tr>...</tr>
</tbody>
</div>

Каждый тег «tr» имеет ту же структуру, что и выше, и тег «a» с соответствующим идентификатором внутри атрибута href. Основная проблема заключается в этом коде:

('a[href=#admin/'+ transactionId + ']')

потому что он возвращается

(a[href=#admin/undefined]) 

Girish Sortur Спасибо за ответы, но я нашел только одно решение, используя этот код:

.getAttribute("p.tac", "transaction-id")
        .then(function(attr){
          transactionId = attr;
          transactionURL = 'a[href="#admin/'+ transactionId + '"]';
        })
        .click('a[href="#admin"]')
        .waitForExist("div.ui-data-table", 10000).then(function(){
          client.click(transactionURL)//That is working now
        })

person Arsenowitch    schedule 02.09.2015    source источник
comment
Не эксперт в этом языке, но попробуйте client.click('a[href=#admin/'+ transactionId + ']')   -  person Corbin    schedule 02.09.2015
comment
Добавьте HTML-код элемента, который вы пытаетесь щелкнуть (и окружающий HTML-код, если это необходимо), вместе с кодом, который вы используете для получения и щелчка по элементу.   -  person JeffC    schedule 02.09.2015
comment
Похоже, это решение должно работать, но веб-драйвер возвращает no such element ("a[href="#admin/undefined"]"), но должен возвращать что-то вроде ("a[href="#admin/"665f5344-b4e8-44e3-ab51-893dcf7bcec1""]")   -  person Arsenowitch    schedule 02.09.2015
comment
@Arsenowitch, не могли бы вы рассказать нам, как вы получаете transactionId ?   -  person Girish Sortur    schedule 02.09.2015
comment
@Arsenowitch Обновлен ответ, чтобы включить синтаксис webdriver-io. Надеюсь, поможет. Дайте мне знать, если все еще есть ошибка. Решение состоит в том, чтобы дождаться возврата транзакции Id, прежде чем щелкнуть по нему.   -  person Girish Sortur    schedule 02.09.2015
comment
@Girish Sortur, теперь мой код выглядит так: .waitForExist("p.tac", 10000) .getAttribute("p.tac", "transaction-id").then(function(attr){ transactionId = attr; }) .click('a[href="#admin"]') .waitForExist("div.ui-data-table", 10000) .click('a[href=#admin/'+ transactionId + ']') Но когда я его запускаю - этот код возвращает undefined для переменной transactionId   -  person Arsenowitch    schedule 02.09.2015


Ответы (1)


Используя только Selenium, вы должны сначала найти элемент, а затем щелкнуть его, потому что метод click() не принимает аргумент. Вот как вы можете это сделать -

driver.findElement(by.xpath('a[href="#admin/'+ transactionId + '"]')).click();

Однако, если вы используете webdriver-io вместе с селеном, сначала убедитесь, что ваш идентификатор транзакции генерируется, а затем щелкните его, поскольку асинхронный javascript выполняется быстро, не дожидаясь возврата идентификатора транзакции. Вот как -

.waitForExist("p.tac", 10000)
.getAttribute("p.tac", "transaction-id")
.then(function(attr){ 
    transactionId = attr; 
})
.click('a[href="#admin"]').waitForExist("div.ui-data-table", 10000)
.waitForVisible('a[href="#admin/'+ transactionId + '"]', 10000)
.click('a[href="#admin/'+ transactionId + '"]');

Надеюсь это поможет.

person Girish Sortur    schedule 02.09.2015
comment
Я не знаю, что именно пошло не так, но выдает ошибку: Не удалось найти элемент на странице по заданным параметрам поиска. - person Arsenowitch; 02.09.2015
comment
Можете ли вы предоставить свою полную ошибку, если это возможно? Было бы полезно, если бы вы также могли создать суть своего кода. - person Girish Sortur; 02.09.2015
comment
Я получаю только ошибку, описанную выше. В административной таблице, которую я получаю, когда нажимаю a[href="#admin"], я вижу список транзакций, каждая из которых имеет ссылку: <a href="#admin/665f5344-b4e8-44e3-ab51-893dcf7bcec1">Details of transaction</a> - person Arsenowitch; 02.09.2015
comment
вероятно, waitForVisible() должен помочь вам тогда. Обновленный ответ с этим кодом. - person Girish Sortur; 02.09.2015
comment
Этот код по-прежнему возвращает ошибку: элемент (a[href=#admin/undefined]) по-прежнему не отображается через 10000 мс. - person Arsenowitch; 03.09.2015
comment
Можете ли вы предоставить свой HTML-код или создать его суть? и находится ли ваша ссылка в поле зрения, когда ссылка появляется на странице? также попробуйте выполнить console.log для transactionId и посмотреть, возвращает ли он что-нибудь. Возможно, сон на несколько секунд может помочь. - person Girish Sortur; 03.09.2015
comment
@ Girish Sortur, я добавил описание выше. - person Arsenowitch; 03.09.2015