2017-10-06 1 views
0

J'ai un tas (milliers) d'anciens scripts de tests unitaires écrits avec l'interface Selenium RC en JavaScript. Puisque nous passons à Selenium 3, je veux essayer de me débarrasser de certaines méthodes RC de façon automatisée en utilisant des scripts Python. Je suis en train de parcourir ces scripts ligne par ligne, en sélectionnant les méthodes Selenese, en les déconstruisant puis en essayant de reconstruire avec l'interface WebDriver. Par exemple:Saisir du texte entre des guillemets simples ou doubles en Python regex

selenium.type("xpath=//*[text()='test, xpath']", "test, text"); 

Est-ce que sortira en ...

driver.findElement(By.xpath("//*[text()='test, xpath']")).sendKeys("test, text"); 

J'ai un système d'identification automatique des méthodes Selenese, le stockage des espaces et séparant la méthode des paramètres, donc ce que je suis gauche avec est la chaîne suivante:

("xpath=//*[text()='test, xpath']", "test, text") 

Un problème que je rencontre est, ils ne sont pas toujours cohérents. Parfois il y a des doubles guillemets imbriquées dans les guillemets simples, ou vice-versa, ou se sont échappés des guillemets doubles imbriquées dans des guillemets doubles, etc. Par exemple:

("xpath=//*[text()=\"test, xpath\"]", "test, text") 
('xpath=//*[text()=\'test, xpath\']', 'test, text') 
('xpath=//*[text()="test, xpath"]', 'test, text') 

Ce sont tous valides. Je veux pouvoir toujours faire correspondre les arguments passés dans la méthode, que les guillemets soient utilisés ou les guillemets simples, et ignorer les guillemets imbriqués à l'opposé de ce qui est utilisé pour ouvrir la chaîne ainsi que les guillemets échappés, puis les retourner comme des listes.

['xpath=//*[text()="test, xpath"]', 'test, text'] 

... etc. J'ai essayé d'utiliser le re.findall en utilisant l'expression suivante.

([\"'])(?:(?=(\\?))\2.)*?\1 

Ce que je récupère est ceci.

>>> print arguments 
[('"', ''), ('"', '')] 

Y at-il quelque chose qui me manque?

+0

pour correspondre à tous les simple/double Chaînes entre guillemets: '(([^ '\\] * (\\.)?) *)' |" (([^ "\\] * (\\.)?) *)" ' –

Répondre

0

Je ne ferais pas ce complexe en utilisant lookbehind ou lookahead. Au contraire, je voudrais construire une regex spécifique à chaque cas. Dans votre cas, vous avez quelque chose comme ci-dessous

("param1", "param2")

('param1', 'param2')

l'intérieur de ces params vous pouvez avoir plus échappèrent citations ou guillemets simples ou non. Mais si une chose à regarder, qui est divisé en utilisant ", " ou ', ', ces motifs exacts se produira rarement dans param1 et param2

donc solution la plus simple non-regex serait de diviser en fonction de ", " ou ', '.Mais il peut y avoir des espaces supplémentaires ou pas d'espace entre, nous utilisons donc un modèle

^\(\s*["']\s*(?<first_param>.*?)("\s*,\s*"|'\s*,\s*')(?<second_param>.*?)\s*["']\s*\)$ 

\(\s*["']\s* pour correspondre aux premiers supports et une citation de départ

(?<first_param>.*?) pour correspondre le premier paramètre

("\s*,\s*"|'\s*,\s*') à correspond à notre modèle de commande divisée

(?<second_param>.*?) pour correspondre au deuxième paramètre

\s*["']\s*\)$ pour correspondre à la fin.

Ce n'est pas parfait, mais fonctionne dans 95% + cas de votre

RegEx Test

Vous pouvez vérifier violon regex sur lien ci-dessous

https://regex101.com/r/z9PytD/1/