2017-02-09 44 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