как избежать ошибки атрибута из классов? - PullRequest
0 голосов
/ 04 июля 2019

Я сделал класс в качестве базовой установки драйвера селена.и я добавил методы к нему.Я хочу получить доступ к методу класса из менеджера контекста. Я пытался создать объект класса в менеджере контекста и получить доступ к методу, но мне не удалось.как мне это сделать?

Я даже не представляю, что не так в этом коде.Пожалуйста, помогите мне.

class SeleniumDriver:
     '''basic setup for chromedriver(selenium)'''

     def __init__(self, 
             driversource='C:\\Users\Ewis\Downloads\chromedriver.exe',
             url = ('https://realpython.com/')
             ):
        self.driversource = driversource
        self.url = url # this tuple

    def __enter__(self):
        self.driver = webdriver.Chrome(executable_path=self.driversource)
        for urls in self.url:
            self.driver.get(urls)
        return self.driver, Keys

    def __exit__(self, exc_type, exc_val, exc_trace):
        self.driver.quit()

# and this code(another project)

from seleniumdriver import SeleniumDriver

with SeleniumDriver() as packed:

    seldriver1 = SeleniumDriver()
    driver = packed[0]
    urls = ('https://realpython.com/','https://stackoverflow.com/')
    resp = seldriver1.geturl(urls)
    for url in resp:
        title, url = resp.titleurl()
        print(title, '\n', url,'\n')

Ошибка

Traceback (most recent call last):
  File "C:\python\progs\web\selenium\navigation_commands\navigation_commands.py", line 9, in <module>
    for url in resp:
  File "c:\python\progs\my_modules\seleniumdriver\seleniumdriver.py", line 22, in geturl
    yield (self.driver).get(url)
AttributeError: 'SeleniumDriver' object has no attribute 'driver'

1 Ответ

0 голосов
/ 04 июля 2019

Я не уверен, что этого достаточно, чтобы решить все проблемы, но:

Вы должны использовать packed[0], который создается с помощью with, и он выполняет __enter__, который создает self.driver

resp = packed[0].geturl(urls)

Но вы используете seldriver1, который создается с помощью seldriver1 = SeleniumDriver(), который не выполняет __enter__, поэтому он не создает self.driver (seldriver1.driver), и вы получаете ошибку:

'SeleniumDriver' object has no attribute 'driver'

from seleniumdriver import SeleniumDriver

with SeleniumDriver() as packed:

    urls = ('https://realpython.com/','https://stackoverflow.com/')
    resp = packed[0].geturl(urls)

    for url in resp:
        title, url = resp.titleurl()
        print(title, '\n', url,'\n')

Ваш код кажется мне странным, и для правильной работы может потребоваться гораздо больше изменений.


РЕДАКТИРОВАТЬ: этот код работает для меня.

Поскольку я использую Firefox в Linux и мне не нужно устанавливать driversource, поэтому я добавил None для запуска без driversource

Я удалил get(url) из __enter__, потому что это бесполезно. Вы не можете получить две страницы в __enter__ и использовать их позже в цикле for, потому что Selenium не сохраняет информацию о первой странице при открытии второй страницы.

from selenium import webdriver


class SeleniumDriver:
    '''basic setup for chromedriver(selenium)'''
    def __init__(self, driversource='C:\\Users\Ewis\Downloads\chromedriver.exe'):
        self.driversource = driversource

    def __enter__(self):
        if self.driversource:
            #self.driver = webdriver.Chrome(executable_path=self.driversource)
            self.driver = webdriver.Firefox(executable_path=self.driversource)
        else:
            #self.driver = webdriver.Chrome()
            self.driver = webdriver.Firefox()
        return self.driver

    def __exit__(self, exc_type, exc_val, exc_trace):
        self.driver.quit()


with SeleniumDriver(None) as driver:
    urls = ('https://realpython.com/', 'https://stackoverflow.com/')
    for url in urls:
        driver.get(url)
        title = driver.title
        print(title, '\n', url,'\n')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...