2017-02-09 62 views
0

我有收集測試服務器的電子郵件的電子郵件的Customer.io帳戶。 有一個iframe需要元素。但我無法接近他們。如果我使用:無法訪問Customer.io的iframe中的元素

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

我並不是說你的工作不正常,只是在Watir中使用XPath並不是很好的做法。 – titusfortner