PagesBrowser.open and PagesBrowser.location always return a Response object

This commit is contained in:
Romain Bignon 2014-03-13 21:24:35 +01:00
commit bf8675c88b
3 changed files with 27 additions and 21 deletions

View file

@ -130,7 +130,7 @@ class AccountsPage(LoggedPage, HTMLPage):
self.env['id'] = id self.env['id'] = id
# Handle real balances # Handle real balances
page = self.page.browser.open(link) page = self.page.browser.open(link).page
coming = page.find_amount(u"Opérations à venir") coming = page.find_amount(u"Opérations à venir")
accounting = page.find_amount(u"Solde comptable") accounting = page.find_amount(u"Solde comptable")
@ -242,7 +242,7 @@ class CardPage(OperationsPage, LoggedPage):
def __iter__(self): def __iter__(self):
card_link = self.el.get('href') card_link = self.el.get('href')
history_url = '%s/%s/fr/banque/%s' % (self.page.browser.BASEURL, self.page.browser.currentSubBank, card_link) history_url = '%s/%s/fr/banque/%s' % (self.page.browser.BASEURL, self.page.browser.currentSubBank, card_link)
page = self.page.browser.location(history_url) page = self.page.browser.location(history_url).page
for op in page.get_history(): for op in page.get_history():
yield op yield op

View file

@ -157,7 +157,14 @@ class BaseBrowser(object):
self.url = self.response.url self.url = self.response.url
return response return response
def open(self, url, referrer=None, allow_redirects=True, **kwargs): def open(self, url, referrer=None,
allow_redirects=True,
stream=None,
timeout=None,
verify=None,
cert=None,
proxies=None,
**kwargs):
""" """
Make an HTTP request like a browser does: Make an HTTP request like a browser does:
* follow redirects (unless disabled) * follow redirects (unless disabled)
@ -187,14 +194,17 @@ class BaseBrowser(object):
:rtype: :class:`requests.Response` :rtype: :class:`requests.Response`
""" """
return self._open(url, referrer, allow_redirects, **kwargs)
def _open(self, url, referrer=None, allow_redirects=True, **kwargs):
req = self.build_request(url, referrer, **kwargs) req = self.build_request(url, referrer, **kwargs)
preq = self.session.prepare_request(req) preq = self.session.prepare_request(req)
# call python-requests # call python-requests
response = self.session.send(preq, allow_redirects=allow_redirects) response = self.session.send(preq,
allow_redirects=allow_redirects,
stream=stream,
timeout=timeout,
verify=verify,
cert=cert,
proxies=proxies)
if allow_redirects: if allow_redirects:
response = self.handle_refresh(response) response = self.handle_refresh(response)
@ -232,7 +242,7 @@ class BaseBrowser(object):
def handle_refresh(self, response): def handle_refresh(self, response):
""" """
Called by _open, to handle Refresh HTTP header. Called by open, to handle Refresh HTTP header.
It only redirect to the refresh URL if the sleep time is inferior to It only redirect to the refresh URL if the sleep time is inferior to
REFRESH_MAX. REFRESH_MAX.
@ -248,7 +258,7 @@ class BaseBrowser(object):
if sleep <= self.REFRESH_MAX: if sleep <= self.REFRESH_MAX:
self.logger.debug('Refresh to %s' % url) self.logger.debug('Refresh to %s' % url)
return self._open(url) return self.open(url)
else: else:
self.logger.debug('Do not refresh to %s because %s > REFRESH_MAX(%s)' % (url, sleep, self.REFRESH_MAX)) self.logger.debug('Do not refresh to %s because %s > REFRESH_MAX(%s)' % (url, sleep, self.REFRESH_MAX))
return response return response

View file

@ -162,15 +162,18 @@ class PagesBrowser(DomainBrowser):
def open(self, *args, **kwargs): def open(self, *args, **kwargs):
response = super(PagesBrowser, self).open(*args, **kwargs) response = super(PagesBrowser, self).open(*args, **kwargs)
response.page = None
# Try to handle the response page with an URL instance. # Try to handle the response page with an URL instance.
for url in self._urls.itervalues(): for url in self._urls.itervalues():
page = url.handle(response) page = url.handle(response)
if page is not None: if page is not None:
self.logger.debug('Handle %s with %s' % (response.url, page.__class__.__name__)) self.logger.debug('Handle %s with %s' % (response.url, page.__class__.__name__))
return page response.page = page
break
self.logger.debug('Unable to handle %s' % response.url) if response.page is None:
self.logger.debug('Unable to handle %s' % response.url)
return response return response
def location(self, *args, **kwargs): def location(self, *args, **kwargs):
@ -178,24 +181,17 @@ class PagesBrowser(DomainBrowser):
# Call leave hook. # Call leave hook.
self.page.on_leave() self.page.on_leave()
page = self.open(*args, **kwargs) response = self.open(*args, **kwargs)
# If open() returns a BasePage instance, store it as the current page.
if isinstance(page, BasePage):
response = page.response
self.page = page
else:
response = page
self.page = None
self.response = response self.response = response
self.page = response.page
self.url = response.url self.url = response.url
if self.page is not None: if self.page is not None:
# Call load hook. # Call load hook.
self.page.on_load() self.page.on_load()
return page return response
def pagination(self, func, *args, **kwargs): def pagination(self, func, *args, **kwargs):
""" """