2010-06-12 14 views
7

Używam xpath w Selenium RC poprzez api Pythona.Jak używać Unicode w ciągu znaków Xpath? (UnicodeEncodeError)

muszę kliknąć element, który znajduje się tekst „Wyślij»”

Tutaj jest błąd, że dostaję:

In [18]: sel.click(u"xpath=//a[text()='Submit \xbb')]") 
--------------------------------------------------------------------------- 
UnicodeDecodeError      Traceback (most recent call last) 

/Users/me/<ipython console> in <module>() 

/Users/me/selenium.py in click(self, locator) 
    282   'locator' is an element locator 
    283   """ 
--> 284   self.do_command("click", [locator,]) 
    285 
    286 

/Users/me/selenium.py in do_command(self, verb, args) 
    201   body = u'cmd=' + urllib.quote_plus(unicode(verb).encode('utf-8')) 
    202   for i in range(len(args)): 
--> 203    body += '&' + unicode(i+1) + '=' + urllib.quote_plus(unicode(args[i]).encode('utf-8')) 
    204   if (None != self.sessionId): 
    205    body += "&sessionId=" + unicode(self.sessionId) 

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 28: ordinal not in range(128) 

Odpowiedz

3
sel.click(u"xpath=//a[text()='Submit \xbb')]") 

Jest możliwe napisanie wyrażeń XPath, które zawierają żadnych znaków Unicode.

Na przykład:

//a[text()='Submit &#xBB;')]

1

myślę, że wystarczy zmienić

sel.click(u"xpath=//a[text()='Submit \xbb')]") 

do

sel.click(u"xpath=//a[text()='Submit \xbb')]".encode('utf8')) 

To dlatego, że błąd wskazuje, że Selen próbuje zakodować obiekt Unicode w łańcuch bajtów (używając domyślnego kodeka dla Pythona, to jest 'ascii') i właśnie to zawodzi; najpierw jawnie kodując go samodzielnie, z czym prawdopodobnie jest właściwy kodek ('utf8', kodowanie domyślne w XML), dlatego powinieneś unikać tego problemu.

+1

Próbowałem dodając, że - to wciąż rzuca UnicodeDecodeError. Jakieś inne pomysły? –

0

Czy sel_click() oczekuje ciągów znaków Unicode lub UTF-8 (bajt)? Przerażający UnicodeEncodeError zwykle ma miejsce, gdy próbujesz przekazać pierwszy, gdy oczekuje się drugiego (lub innego kodowania).

Nie mogę spróbować go teraz, ale można spróbować

"xpath=//a[text()='Submit \xc2\xbb')]" 

zamiast swojego argumentu (które można uzyskać za pomocą .encode('utf-8')) na nim.

+0

(Hm, nieważne, wydaje mi się, że pisałem to, a Alex Martelli już napisał odpowiedź ...) – chryss

Powiązane problemy