2017-02-09 1 views
0

J'ai un compte Customer.io pour les e-mails qui collectent les e-mails du serveur de test. Il y avait un iframe où il y avait des éléments nécessaires. Mais je ne peux pas les atteindre. Si j'utilise:Impossible d'accéder aux éléments qui figurent dans iframe de 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 

Puis-je obtenir l'erreur suivante:

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) 
... 

Et si j'utilise ceci:

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 

Je ne comprends pas cette erreur, mais l'élément ne pouvait pas être trouvé.

Répondre

0

Le problème semble être lié à l'analyse de la chaîne XPath iframe. Je ne comprends pas pourquoi l'interprète a des problèmes, mais voici quelques solutions:

Pour le premier exemple, passer à l'aide des guillemets simples comme la partie extérieure de la chaîne:

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 

Pour le second exemple , vous avez besoin de citer la valeur de l'attribut. Si vous voulez coller avec des guillemets doubles pour la chaîne, vous pouvez échapper aux guillemets doubles internes:

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 

Alternativement, vous voudrez peut-être envisager d'éviter le problème XPath en utilisant d'autres localisateurs:

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

que j'ai trouvé une autre façon:

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

Parce que les exemples ne veulent pas travailler. Je ne sais pas pourquoi.

Mais merci Justin:

1

L'un des objectifs de Watir est de ne jamais avoir à utiliser XPath.

Tenir compte de réécrire votre localisation avec des expressions régulières comme celui-ci:

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

Merci, mais mon exemple fonctionne. Et votre travaille aussi. –

+0

Je ne dis pas que le vôtre ne marche pas, mais utiliser XPath avec Watir n'est pas une bonne pratique en général. – titusfortner