Androiddriver Python绑定httplib

Androiddriver Python绑定httplib,android,python,selenium-webdriver,remotewebdriver,Android,Python,Selenium Webdriver,Remotewebdriver,我成功地在模拟器上安装了androiddriver,但我正在努力克服httplib错误。下面是我在mac上安装android sdk后采取的步骤 1. ./adb devices, which returned emulator-5554 2. ./adb emulator-5554 -s forward tcp:8080 tcp:8080 3. visited http://localhost:8080/wd/hub/status in my browser and received a {

我成功地在模拟器上安装了androiddriver,但我正在努力克服httplib错误。下面是我在mac上安装android sdk后采取的步骤

1.  ./adb devices, which returned emulator-5554
2. ./adb emulator-5554 -s forward tcp:8080 tcp:8080
3. visited http://localhost:8080/wd/hub/status in my browser and received a { status: 0 }
4. In the python shell (tried this on both python 2.7 & 2.6), I did:

>> from selenium import webdriver
>> from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
>> driver = webdriver.Remote("http://localhost:8080/wd/hub",     webdriver.DesiredCapabilities.ANDROID)
>> driver.get("http://www.google.com")
有时,当我设置驱动变量时,我会得到错误(如下所示),有时不会。driver.get命令也是如此

stacktrace如下所示:

  File "<stdin>", line 1, in <module>
  File "/Library/Python/2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 177, in get
    self.execute(Command.GET, {'url': url})
  File "/Library/Python/2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 163, in execute
    response = self.command_executor.execute(driver_command, params)
  File "/Library/Python/2.7/site-packages/selenium/webdriver/remote/remote_connection.py", line 349, in execute
    return self._request(url, method=command_info[0], data=data)
  File "/Library/Python/2.7/site-packages/selenium/webdriver/remote/remote_connection.py", line 396, in _request
response = opener.open(request)
  File     "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 394, in open
    response = self._open(req, data)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 412, in _open
'_open', req)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 372, in _call_chain
    result = func(*args)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1199, in http_open
    return self.do_open(httplib.HTTPConnection, req)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1170, in do_open
    r = h.getresponse(buffering=True)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 1027, in getresponse
response.begin()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 407, in begin
version, status, reason = self._read_status()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 371, in _read_status
    raise BadStatusLine(line)
httplib.BadStatusLine: ''
文件“”,第1行,在
get中的文件“/Library/Python/2.7/site packages/selenium/webdriver/remote/webdriver.py”,第177行
self.execute(Command.GET,{'url':url})
文件“/Library/Python/2.7/site packages/selenium/webdriver/remote/webdriver.py”,执行中的第163行
响应=self.command\u executor.execute(driver\u command,params)
文件“/Library/Python/2.7/site packages/selenium/webdriver/remote/remote_connection.py”,执行中的第349行
返回self.\u请求(url,方法=命令\u信息[0],数据=数据)
文件“/Library/Python/2.7/site packages/selenium/webdriver/remote/remote\u connection.py”,第396行,在请求中
响应=opener.open(请求)
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py”,第394行,打开
响应=自身打开(请求,数据)
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py”,第412行,打开
"开放",
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py”,第372行,在调用链中
结果=func(*args)
http_open中的文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py”,第1199行
返回self.do_open(httplib.HTTPConnection,req)
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py”,第1170行,打开
r=h.getresponse(缓冲=True)
getresponse中的文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py”,第1027行
response.begin()
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py”,第407行,在begin中
版本、状态、原因=self.\u读取\u状态()
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py”,第371行,处于“读取”状态
升起状态行(行)
httplib.BadStatusLine:“”

还有其他人对此有想法吗?

正如您所说,这在android服务器的应用程序中是固定的。但是,对于那些无法更新的页面:导致这种情况的原因是驱动程序假设页面加载提前到正在加载的实际页面。Selenium从驱动程序接收到一些HTTP头,并且状态行无效。比如说,

状态行不是HTTP/1.0 200,而是空白的(如上所述)

我发现解决这个问题的一种方法是在假定页面已加载的情况下等待足够长的时间,然后尝试建立连接

我通常会在这一行代码中遇到此异常:

android = webdriver.Remote(command_executor='http://127.0.0.1:8080/wd/hub', desired_capabilities=capabilities.ANDROID)
为了解决这个问题,我将代码改为等待调用成功:

android = None
while android is None:
    try:
        android = webdriver.Remote(command_executor='http://127.0.0.1:8080/wd/hub', desired_capabilities=capabilities.ANDROID)
    except:
        time.sleep(1)
        pass

请注意,在我从2.3.2 APK降级到2.2.1 APK之前,我在
save_屏幕截图
BadStatusLine
方面仍然存在问题,更新-我安装了旧版本的android服务器APK(以前使用的是android-2.32.0).有了android-server-2.21.0.apk,这一切都很顺利。我一整天都在努力让它正常工作。我从来没有想到apk是个问题。