2015-12-31 2 views
0

Я пытаюсь использовать Python 3, чтобы создать объект Selenium с введите и Выйдите функции, так что я могу использовать его следующим образом:Python с утверждением (__enter__ и __exit__) не может вызвать функцию

with Browser() as browser: 
    brower.getURL('http://www.python.org') 

Однако всякий раз, когда я пытаюсь запустить это я получаю следующее сообщение об ошибке:

Traceback (most recent call last): 
    File "browser.py", line 54, in <module> 
    print(browser.getURL(url)) 
AttributeError: 'NoneType' object has no attribute 'getURL' 

кто-нибудь знает, что я делаю неправильно? Ниже мой код:

from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 
import os 

CHROMEBROWSERLOCATION = './drivers/chromedriver' 

class Browser(object): 
    """Handles web browser""" 
    def __init(self): 
     """Class Initialization Function""" 

    def __call__(self): 
     """Class call""" 

    def startDriver(self,browser="chrome"): 
     """Starts the driver""" 
     #Make sure that the browser parameter is a string 
     assert isinstance(browser,str) 

     #Standardize the browser selection string 
     browser = browser.lower().strip() 
     #Start the browser 
     if browser=="chrome": 
      self.driver = webdriver.Chrome(CHROMEBROWSERLOCATION) 

    def closeDriver(self): 
     """Close the browser object""" 
     #Try to close the browser 
     try: 
      self.driver.close() 
     except Exception as e: 
      print("Error closing the web browser: {}".format(e)) 

    def getURL(self,url): 
     """Retrieve the data from a url""" 
     #Retrieve the data from the specified url 
     data = self.driver.get(url) 

     return data 

    def __enter__(self): 
     """Set things up""" 
     #Start the web driver 
     self.startDriver() 

    def __exit__(self, type, value, traceback): 
     """Tear things down""" 
     #Close the webdriver 
     self.closeDriver() 

if __name__ == '__main__': 
    url = 'http://www.python.org' 
    with Browser() as browser: 
     print(browser.getURL(url)) 

ответ

3

Вы должны вернуть объект в __enter__:

def __enter__(self): 
    """Set things up""" 
    #Start the web driver 
    self.startDriver() 
    return self 

Вы сейчас возвращающегося None (по умолчанию), и это означает, что он пытается вызвать getURL на None (потому что browser - None, а не пример Browser, который вы намеревались).

+0

Это сделало это, спасибо за урок! – user2694306

+0

BTW ... (Не должно иметь никакого значения, поскольку он пуст, но) вероятно, '__init' должен был быть' __init__' –

Смежные вопросы