splinter visit bug
spilnter官方给出的方法,启动浏览器打开一个网页可以用visit
我们看一下这个visit的实现
def visit(self, url): self.connect(url) self.ensure_success_response() self.driver.get(url)
先尝试连接网站
然后判断连接是否成功
最终使用selenium原生的API driver.get打开url
connect尝试连接之后会返回http response code ,正常是200 ,错误也有可能是500 或者400
self.ensure_success_response() 这个一部是检查code
具体实现
http_errors = (400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 500, 501, 502, 503, 504, 505) def is_valid_response(self): """ Returns ``True`` if the response is valid (:attr:`code` < 400). Otherwise, raises an :class:`HttpResponseError ` exception. """ if self.code in self.http_errors: raise HttpResponseError(self.code, self.reason) return True
400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 500, 501, 502, 503, 504, 505
这些返回值都要被抛出异常
这种做法看起来是OK的,实际使用会遇到一些问题。
比如我们打开IIS认证的页面,这个时候直接去connect肯定会报出401,但是我们的场景就需要认证这个步骤,所以我认为这个是一个bug。
再一步说,工具的行为是打开页面,而不应该去过多的干涉打开的结果,如果我的场景就想要一个500的页面,是不是不能使用这个工具呢了呢。。。。。
所以,我这里给出两种办法解决这个bug
第一个大家都想到了,使用原生的webdriver API driver.get(url)
这个方法有个缺陷,selenium 发现需要认证后,会一直等待,我也不知道它会等多久才超时,谁知道请告诉我,所以最好还是跳到第二种
第二种,使用URL跳转的方式绕过,因为splinter只会检测第一次打开的url,之后怎么跳转,他是不管的
提了一个issue给官方,他们已经把它作为一个bug了