2010-06-12 30 views
7

Tôi đang sử dụng xpath trong Selenium RC thông qua api Python.Làm thế nào để sử dụng unicode bên trong một chuỗi xpath? (UnicodeEncodeError)

tôi cần phải bấm vào một yếu tố người là văn bản được "Gửi»"

Đây là lỗi mà tôi nhận được:

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) 

Trả lời

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

Có thể viết các biểu thức XPath có chứa bất kỳ ký tự Unicode.

Ví dụ:

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

1

Tôi nghĩ rằng bạn chỉ cần thay đổi

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

to

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

Đó là vì lỗi chỉ ra Selenium đang cố gắng mã hóa đối tượng Unicode thành chuỗi byte (sử dụng codec mặc định cho Python, tức là, 'ascii') và đó là những gì không thành công; bằng cách tự mã hóa chính nó trước tiên, với những gì có lẽ là codec đúng ('utf8', mã hóa mặc định trong XML), do đó bạn nên tránh vấn đề này.

+1

tôi đã cố gắng nói thêm rằng - nó vẫn ném một UnicodeDecodeError. Bất kỳ ý tưởng nào khác? –

0

Liệu sel_click() có mong đợi chuỗi unicode hoặc chuỗi utf-8 (byte) không? The UnicodeEncodeError sợ hãi thường xảy ra khi bạn cố gắng vượt qua trong lần đầu tiên khi sau này (hoặc một số mã hóa khác) được mong đợi.

tôi không thể thử nó ngay bây giờ, nhưng bạn có thể thử

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

thay vì lập luận của bạn (mà bạn nhận được bằng cách sử dụng .encode('utf-8')) trên đó.

+0

(Hm, không bao giờ. Có vẻ như tôi đã đánh máy trong khi Alex Martelli đã đăng câu trả lời rồi ...) – chryss

Các vấn đề liên quan