我正在尝试使用IronPython获取selenium2 Sauce OnDemand服务的通用示例代码,用于我正在进行的一些测试工作,而且我遇到了一个我无法弄清楚的问题。
首先,这是环境:
Windows 7 Home Premium,64位。
IronPython 2.7.0.40 on .Net 4.0.30319.225
我的路径:
>>> sys.path
['.', 'C:\\users\\me\\scripts\\python', 'C:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\Common7\\IDE\\Extensions\\Microsoft\\IronStudio\\0.4\\Lib', 'C:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\Common7\\IDE\\Extensions\\Microsoft\\IronStudio\\0.4\\DLLs', 'C:\\opt\\win\\ipy\\Lib', 'C:\\opt\\win\\ipy\\DLLs', 'C:\\opt\\win\\ipy']
我知道IronPython在使用压缩蛋时遇到了问题,因此我将以下库提取到sys.path中的\ Lib目录中:
硒(2.0b4dev)
rdflib (3.1.0)
现在,来自Sauce Labs的示例代码:
import unittest
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
class Selenium2OnSauce(unittest.TestCase):
def setUp(self):
desired_capabilities = dict(platform="WINDOWS",
browserName="firefox",
version="3.6",
name="Hello, Selenium 2!")
self.driver = webdriver.Remote(
desired_capabilities=desired_capabilities,
command_executor="http://me:my-site-access-key@ondemand.saucelabs.com:80/wd/hub")
def test_sauce(self):
self.driver.get('http://example.saucelabs.com')
assert "Sauce Labs" in self.driver.title
def tearDown(self):
self.driver.quit()
if __name__ == '__main__':
unittest.main()
这是我得到的错误:
Traceback (most recent call last):
File "selenium2_test.py", line 3, in <module>
File "c:\opt\win\ipy\Lib\selenium\webdriver\__init__.py", line 18, in <module>
File "c:\opt\win\ipy\Lib\selenium\webdriver\firefox\webdriver.py", line 24, in <module>
File "c:\opt\win\ipy\Lib\selenium\webdriver\firefox\firefox_profile.py", line 23, in <module>
File "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Microsoft\IronStudio\0.4\Lib\rdflib\__init__.py", line 65, in <module>
File "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Microsoft\IronStudio\0.4\Lib\rdflib\namespace.py", line 282, in <module>
ImportError: No module named unicodedata
我已经尝试在其中搜索包含unicodedata的软件包(例如FePY),但它们似乎都不起作用。我试过从我的Python27安装中复制.pyd,但这也不起作用。
这是IronPython 2.7中尚未提供的内容吗?或者,是否有可以引用的库或命名空间来完成相同的任务?
如果没有,我想我不得不离开selenium2,直到Iron家伙获得IP27的unicoded。 :(
谢谢,
格雷格。
答案 0 :(得分:2)
唉,unicodedata模块目前不包含在IronPython中。但不要害怕!对于即将发布的2.7.1版本将会有它,你的所有麻烦都将不复存在。
很抱歉。至于2.7.1何时发布,我想6月初。您可以检查https://github.com/IronLanguages/main/commit/5395af28b5794b0acf982ab87d17466925ab819f是否有补丁,但由于包含的Unicode数据库,它相当大而且繁琐。
答案 1 :(得分:0)
请参阅@Micheal Greene对原始问题的评论。以下是按指示编辑的模块:
# Copyright (c) 2006 by Seo Sanghyeon
# 2006-07-13 sanxiyn Created
# 2006-07-19 sanxiyn Added unidata_version, normalize
# Modified 2011 - Greg Gauthier - To provide needed functionality for rdflib
# and other utilities, in IronPython 2.7.0
unidata_version = '3.2.0'
# --------------------------------------------------------------------
# Normalization
from System import String
from System.Text import NormalizationForm
def normalize(form, string):
return String.Normalize(string, _form_mapping[form])
_form_mapping = {
'NFC': NormalizationForm.FormC,
'NFKC': NormalizationForm.FormKC,
'NFD': NormalizationForm.FormD,
'NFKD': NormalizationForm.FormKD,
}
# --------------------------------------------------------------------
# Character properties
from System.Globalization import CharUnicodeInfo
def _handle_default(function):
def wrapper(unichr, default=None):
result = function(unichr)
if result != -1:
return result
if default is None:
raise ValueError()
return default
return wrapper
decimal = _handle_default(CharUnicodeInfo.GetDecimalDigitValue)
digit = _handle_default(CharUnicodeInfo.GetDigitValue)
numeric = _handle_default(CharUnicodeInfo.GetNumericValue)
def category(unichr):
uc = CharUnicodeInfo.GetUnicodeCategory(unichr)
return _category_mapping[int(uc)]
_category_mapping = {
0: 'Lu',
1: 'Ll',
2: 'Lt',
3: 'Lm',
4: 'Lo',
5: 'Mn',
6: 'Mc',
7: 'Me',
8: 'Nd',
9: 'Nl',
10: 'No',
11: 'Zs',
12: 'Zl',
13: 'Zp',
14: 'Cc',
15: 'Cf',
16: 'Cs',
17: 'Co',
18: 'Pc',
19: 'Pd',
20: 'Ps',
21: 'Pe',
22: 'Pi',
23: 'Pf',
24: 'Po',
25: 'Sm',
26: 'Sc',
27: 'Sk',
28: 'So',
29: 'Cn',
}
# added for rdflib/ironpython
def decomposition(unichr):
return String.Normalize(unichr.ToString(), NormalizationForm.FormD)