无法访问 Customer.io 的 iframe 中的元素
Can't get to elements which there are in iframe of Customer.io
我有 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
然后我没有得到这个错误,但是找不到元素。
问题似乎与 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
对于第二个示例,您确实需要引用属性值。如果你想坚持使用 double-quotes 作为字符串,你可以转义内部的 double-quotes:
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
我找到了另一种方法:
@browser.iframe(xpath: "//iframe[contains(@class,'ember')]").td(xpath: "//td[contains(text(), 'Order Confirmation')]")
因为示例不想工作。不知道为什么。
但是谢谢贾斯汀:
Watir 的目标之一是永远不必使用 XPath。
考虑使用如下正则表达式重写您的定位器:
@browser.iframe(class: /ember/).td(text: /Order Confirmation/)
我有 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
然后我没有得到这个错误,但是找不到元素。
问题似乎与 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
对于第二个示例,您确实需要引用属性值。如果你想坚持使用 double-quotes 作为字符串,你可以转义内部的 double-quotes:
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
我找到了另一种方法:
@browser.iframe(xpath: "//iframe[contains(@class,'ember')]").td(xpath: "//td[contains(text(), 'Order Confirmation')]")
因为示例不想工作。不知道为什么。
但是谢谢贾斯汀:
Watir 的目标之一是永远不必使用 XPath。
考虑使用如下正则表达式重写您的定位器:
@browser.iframe(class: /ember/).td(text: /Order Confirmation/)