2017-05-12 3 views
1

J'essaie de trouver un élément de texte en utilisant XPath en utilisant JavascriptExecutor. Le problème est que le texte a une apostrophe, et je ne sais pas comment y échapper dans ce cas. Normalement, c'est juste assez avec \". Pourriez-vous m'aider?JavascriptExecutor XPath avec apostrophe

J'ai déjà essayé les options suivantes:

((JavascriptExecutor)driver).executeScript("var path = '//*[text()=\"d'arrivée\"]/following-sibling::div/div'; 
var x = document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;x.style.display='block';");` 

et

((JavascriptExecutor)driver).executeScript("var path = '//*[text()=\"d\"arrivée\"]/following-sibling::div/div'; 
var x = document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;x.style.display='block';");` 
+0

Comme @Andersson suggéré, je devais mettre \\ » pour échapper à l'apostrophe dans le texte: (pilote (JavascriptExecutor))' recueil HSC. executeScript ("var chemin = '// * [texte() = \" d \\' arrivée \ "]/suivi-sibling :: div/div '; var x = document.évalue (chemin, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null) .ssingleNodeValue; x.style.display = 'block'; ");' – Christina

Répondre

1

Essayez ci-dessous expression avec échappé apostrophe:

'//*[text()="d\'arrivee"]/following-sibling::div/div' 

Lorsque vous utilisez une chaîne entre guillemets simples, vous devrait échapper à une apostrophe avec une seule barre oblique inverse. Les guillemets doubles n'ont pas besoin d'être échappés dans ce type de chaîne.

+0

Merci, mais cela n'a pas fonctionné. Je dois d'abord échapper aux délimiteurs du texte: text() = \ "exempletext \", puis échapper l'apostrophe dans le texte. pilote 'code' ((JavascriptExecutor)) .executeScript (" var chemin = '// * [texte() = \ "d \' arrivée \"]/follow-sibling :: div/div '; var x = document.evaluate (chemin, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null) .singleNodeValue; x.style.display = 'block'; "); 'code' P.S.J'ai raccourci le texte recherché dans la question, et laissé un espace ..., j'ai édité maintenant la question. – Christina

+1

Pouvez-vous essayer le pilote ((JavascriptExecutor)) .executeScript ("var chemin = '// * [texte() = \" d \\' arrivee "]/following-sibling :: div/div '; var x = document.evaluate (chemin, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null) .singleNodeValue; x.style.display = 'block'; ");' – Andersson

+0

Merci beaucoup! Cela a fonctionné :) – Christina

0

En variante, essayez de trouver un autre Xpath-locator sans apostrophe. N'utilisez pas la fonction "text()" ou utilisez une partie du texte avec "contains()". Je pense que c'est réel.

+0

En utilisant "contains()" recherche seulement une partie du texte fonctionne, mais il existe des textes similaires, et je préférerais une correspondance exacte. Merci. – Christina

1

Construisez d'abord l'expression XPath dont vous avez besoin. Dans XPath 1.0 la seule façon d'écrire un apostrophe littérale est d'utiliser des guillemets doubles comme séparateur de chaîne, de sorte que l'expression XPath est:

//*[text()="d'arrivee"]/following-sibling::div/div 

(bien que l'utilisation plutôt que « texte() » est mieux « » entraine toi). Ensuite, réfléchissez à la façon d'éviter cela en tant que littéral chaîne dans le langage hôte choisi, en l'occurrence Javascript. En Javascript, vous pouvez utiliser ' ou " comme délimiteur de chaîne, et vous devez alors échapper toutes les occurrences du délimiteur de chaîne avec une barre oblique inverse. Ainsi, il devient soit

"//*[text()=\"d'arrivee\"]/following-sibling::div/div" 

ou

'//*[text()="d\'arrivee"]/following-sibling::div/div'