2016-07-12 3 views
0

Я изо всех сил пытаюсь найти решение этого.Iterate over array Capybara Cucumber

Я обращаюсь к таблице на веб-странице. После применения определенного фильтра один элемент данных в каждой строке должен содержать определенное значение.

Я попытался создать массив из данных таблицы, сделав каждую строку своим собственным индексом.

Как только у меня есть индекс, я хочу, чтобы область внутри этой строки находила определенное значение, которое я получаю после.

До сих пор я получил следующее:

results_table = all('table#clickable-rows tr') 

    results_table.each do |row| 


    within(results_table[row]) do 
     table_data = all('table#clickable-rows td') 
      expect(table_data[3]).to have_text TEXT 
     end 
    end 
    end 

Это итерация я борюсь с. У кого-нибудь есть решение?

Благодаря

ответ

1

Несколько вещей здесь не так - как только вы начинаете перебор на results_table строки фактической строки элемента (не индекс к строке), так что вы не должны индексировать в results_table снова. Кроме того, после того, как вы вызвали within(element), все наборы CSS будут относиться к этому элементу, поэтому вам не нужно будет снова искать таблицу (если не искать таблицу, встроенную в исходную таблицу). Вы, вероятно, хотите что-то больше похоже на

results_table = all('table#clickable-rows tbody tr') 
results_table.each do |row| 
    within(row) do 
    table_data = all('td') # you could also just find the third one with nth-child if you only want that one column 
    expect(table_data[3]).to have_text TEXT 
    end 
end 

конец

или без использования в

results_table = all('table#clickable-rows tbody tr') 
results_table.each do |row| 
    table_data = row.all('td') 
    expect(table_data[3]).to have_text TEXT 
end 

Одна важная вещь, чтобы отметить здесь, что по умолчанию all не ждать строк появляться, так если это выполняется с помощью драйвера JS, вероятно, вы хотите использовать что-то вроде

results_table = all('table#clickable-rows tbody tr', minimum: 1) #you can adjust minimum if you need to wait for more rows to be on the page 

, чтобы убедиться, что строки таблицы фактически появились на странице

+0

Hi @Tom Walpole, я пробовал оба решения и имел одинаковый результат для обоих. RSpec :: Ожидания :: ExpectationNotMetError: ожидается найти текст «ТЕКСТ» в «» – Tom

+0

@ Тома, тогда текста там нет - опубликуйте фактический HTML, который вы пытаетесь найти. –

+0

При использовании puts row.text он показывает весь текст строки и конкретный текст, который я за ним включен. Это просто, когда мы пытаемся использовать его, он терпит неудачу. Это результат puts row.text 'A123ABC Ferrari 48 SORN Renew 28 ноября 2005 г. Мне нужно, чтобы каждая строка содержала «SORN», так как это критерии фильтра – Tom

0

Здесь я был обращен к решению с помощью сообщества.

Мое results_table и table_data переменные, необходимые для включения тела. Как только я добавил это, он смог найти желаемый контент.

results_table = all('table#clickable-rows tbody tr') 
    results_table.each do |row| 
     within(row) do 
     table_data = all('table#clickable-rows tbody tr td') 
      expect(table_data[3]).to have_text TEXT 
    end 
    end 
end 
+0

У вас все еще есть масса лишних ненужных вещей - единственная причина, в том числе и то, что изменит ситуацию, - это то, что ваш запрос строки соответствовал строке в thead, у которой не было ожидаемого контента. В этом случае это означает добавление tbody в первую строку, правильно отфильтрованную строки, и внутренний цикл просто становится 'expect (row.all ('td') [3]). Have_text TEXT' –

+0

Это намного лучше !!! Если вы хотите добавить его в качестве ответа, я соглашусь с ним. спасибо – Tom