2011-08-04 14 views
5

私は、Selenium 2.0 Pythonのwebdriverを使ってオートメーションテストスイートをセットアップするための共通ライブラリを作成しています。PythonでXPathリテラルをエスケープする

​​

私はそれをサポートできるように、「メッセージ」は使用されるメモリスロットの数(32)があるメモリスロットの数を超えて」のようなものであれば、XPathクエリに渡す前に、メッセージを脱出したいと思います(16)」

エスケープせず、XPathクエリが動作しません、それが含まれているため、 『(』と 『)』ライブラリは、我々はPythonでこれを実行するために使用することができます

?利用可能

これは簡単な質問ですが、Pythonでの経験はあまりありません。

ありがとうございます。

追加情報

//span[@class='error'][contains(.,'The number of memory slots used \(32\) exceeds the number of memory slots that are available \(16\)')] 

:問合せは下記の目的のコンポーネントを返しますが

//span[@class='error'][contains(.,'The number of memory slots used (32) exceeds the number of memory slots that are available (16)')] 

:放火犯でテスト中

は、クエリは以下の何の結果を返しません論理的には、この問題はを\)に置き換えることで解決できます彼の特定の文字列リテラルが、まだ他の文字がエスケープされる必要があります。だから適切な方法でこれを行うためのライブラリはありますか?

+0

は、それらの括弧をエスケープする必要があるあなたは確かにいますか?いくつかの使用例と実際のエラーメッセージを投稿できますか? – muhuk

+0

詳細情報 –

答えて

7

括弧はそこでうまくいくはずです。それらは、アポストロフィで区切られたXPath文字列リテラルの内部にあるため、containsの条件が途中で終了することはありません。

問題は、文字列リテラルを終了して式を壊すので、文字列にアポストロフィがあるとどうなりますか。残念なことにXPath文字列リテラルの文字列エスケープスキームはありません。そのため、通常はconcat('str1', "'", 'str2')のような面倒な文字を生成するために式を使用して回避する必要があります。ここで

はそれを行うにはPythonの関数です:

def toXPathStringLiteral(s): 
    if "'" not in s: return "'%s'" % s 
    if '"' not in s: return '"%s"' % s 
    return "concat('%s')" % s.replace("'", "',\"'\",'") 

"//span[@class='error'][contains(.,%s)]" % toXPathStringLiteral(message) 
+0

あなたのソリューションに感謝してください、それは動作します! –

関連する問題