2017-02-09 5 views
0

У меня есть учетная запись Customer.io, которая собирает электронные письма с тестового сервера. Там в iframe, где нужны элементы. Но я не могу добраться до них. Если я использую:Невозможно добраться до элементов, которые есть в iframe Customer.io

page.in_iframe(xpath: "//iframe[contains(@class, 'ember-view')]") do |frame| 
    page.cell_element(xpath: "//td[contains(text(), 'Order Confirmation')]", frame: frame).when_present(30) 
end 

Тогда я получаю следующую ошибку:

SyntaxError: (eval):1: syntax error, unexpected tIDENTIFIER, expecting ')' 
.../iframe[contains(@class, 'ember-view')]').td(identifier) 
...        ^
(eval):1: syntax error, unexpected tSTRING_BEG, expecting keyword_do or '{' or '(' 
...e[contains(@class, 'ember-view')]').td(identifier) 
...        ^
(eval):1: syntax error, unexpected ')', expecting end-of-input 
...ntains(@class, 'ember-view')]').td(identifier) 
... 

И если я использую это:

page.in_iframe(xpath: "//iframe[contains(@class, ember)]") do |frame| 
    page.cell_element(xpath: "//td[contains(text(), 'Order Confirmation')]", frame: frame).when_present(30) 
end 

Тогда я не получаю эту ошибку, но элемент не мог быть найденным.

ответ

0

Проблема заключается в разборе строки iframe XPath. Я не понимаю, почему переводчик имеет проблемы, но вот некоторые решения:

Для первого примера, переход к использованию одиночных кавычек в качестве внешней части строки:

page.in_iframe(xpath: '//iframe[contains(@class, "ember-view")]') do |frame| 
    page.cell_element(xpath: "//td[contains(text(), 'Order Confirmation')]", frame: frame).when_present(30) 
end 

Для второго примера , вам нужно указать значение атрибута. Если вы хотите придерживаться двойные кавычки для строки, вы можете избежать внутренние двойные кавычки:

page.in_iframe(xpath: "//iframe[contains(@class, \"ember\")]") do |frame| 
    page.cell_element(xpath: "//td[contains(text(), 'Order Confirmation')]", frame: frame).when_present(30) 
end 

В качестве альтернативы, вы можете рассмотреть возможность избежать проблемы XPath с помощью других локаторы:

page.in_iframe(class: 'ember-view') do |frame| 
    page.cell_element(text: /Order Confirmation/, frame: frame).when_present(30) 
end 
0

Я нашел еще один способ:

@browser.iframe(xpath: "//iframe[contains(@class,'ember')]").td(xpath: "//td[contains(text(), 'Order Confirmation')]") 

Потому что примеры не хотят работать. Не знаю, почему.

Но благодаря Джастин:

1

Одна из целей Watir, чтобы никогда не придется использовать XPath.

Рассмотрим переписывать локатора с регулярными выражениями, как это:

@browser.iframe(class: /ember/).td(text: /Order Confirmation/) 
+0

Спасибо, но мой пример работает. И твой тоже работает. –

+0

Я не говорю, что ваш не работает, просто использование XPath с Watir не является хорошей практикой в ​​целом. – titusfortner