2

I'm building a custom class to add feautures to selenium.webdriver.Chrome on Python 3.6.2.

from selenium import webdriver

class MyChrome:
    def __init__(self):
        self.mydriver = webdriver.Chrome()

So far, beside some custom methods I made myself, I used to overridden some selenium.webdriver.Chrome very standard methods like this:

    def get(self, url):
        self.mydriver.get(url)

Since I don't want to waste time rewriting like that methods like get, find_element_by_xpath, etc... that already works fine for me I tried the following, as suggested here and here

def __getattr__(self, name, *args, **kwargs):
        return getattr(self.mydriver, name)(*args, **kwargs)

But when I run the following code

from selenium import webdriver

class MyChrome:
    def __init__(self):
        self.mydriver = webdriver.Chrome()

    def __getattr__(self, name, *args, **kwargs):
        return getattr(self.mydriver, name)(*args, **kwargs)

chrome = MyChrome()
chrome.get('https://stackoverflow.com/')

I encounter the error

Traceback (most recent call last):
  File "MyChrome.py", line 11, in <module>
    chrome.get('https://stackoverflow.com/')
  File "MyChrome.py", line 8, in __getattr__
    return getattr(self.mydriver, name)(*args, **kwargs)
TypeError: get() missing 1 required positional argument: 'url'

How do I redirect calls to unknown methods called on my object chrome to it's instance variable self.driver?

1 Answers1

2

I created a custom Webdriver once to add features to selenium Chrome Webdriver and I did that by subclassing selenium Chrome Webdriver. This way you inherit all the webdriver methods without a getattr

from selenium.webdriver import Chrome

class MyChrome(Chrome):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

 # add all your custom features 

It doesn't provide answer to your question but something you can leverage

Satish
  • 1,976
  • 1
  • 15
  • 19
  • This is definitely the best approach. I should have extended `Chrome` class from the beginning. Anyway I was looking for another solution because at the moment I'm quite deep in this project and I'd prefer to avoid massively change the code. –  Feb 15 '18 at 19:51