无法访问Customer.io的iframe中的元素

时间:2017-02-09 15:05:54

标签: watir watir-webdriver page-object-gem

我有来自测试服务器收集电子邮件的电子邮件的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

然后我没有收到此错误,但无法找到元素。

3 个答案:

答案 0 :(得分:1)

Watir的目标之一是永远不必使用XPath。

考虑用这样的正则表达式重写你的定位器:

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

答案 1 :(得分:0)

问题似乎在于解析iframe XPath字符串。我不明白为什么翻译有问题,但这里有一些解决方案:

对于第一个示例,切换到使用单引号作为String的外部部分:

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

对于第二个示例,您需要引用属性值。如果你想坚持使用String的双引号,你可以转义内部双引号:

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

答案 2 :(得分:0)

我找到了另一种方式:

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

因为这些例子不想工作。不知道为什么。

但是感谢贾斯汀: