PHPFixing
  • Privacy Policy
  • TOS
  • Ask Question
  • Contact Us
  • Home
  • PHP
  • Programming
  • SQL Injection
  • Web3.0

Wednesday, October 26, 2022

[FIXED] How can I use selenium options when a class is inherited from (webderiver.Firefox)

 October 26, 2022     inheritance, oop, python, selenium     No comments   

Issue

Simple using of options in python selenium is easy:

options = webdriver.FirefoxOptions()
options.headless=True

driver = webdriver.Firefox(options=options)

driver.get('https://lxml.de')
print(driver.title)

This is the code I understand. My question is how to use options with OOP when a class has an inheritance from (webdriver.Firefox). Like in this code:

class Get_selenium_dynamic_data(webdriver.Firefox):
    

    def __init__(self, teardown=True):

        self.teardown = teardown
        super(Get_selenium_dynamic_data, self).__init__()

        self.implicitly_wait(10)
        self.maximize_window() 

Obviously things like these don't work:

options = webdriver.FirefoxOptions()
options.headless=True
class Get_selenium_dynamic_data(webdriver.Firefox(options=options)):

neither this one:

class Get_selenium_dynamic_data(webdriver.Firefox):
    def __init__(self, teardown=True):
        options = webdriver.FirefoxOptions()
        options.headless=True
        self(option=options)
        #self = self(option=options)

Solution

This question has nothing to do with selenium and applies to OOP's inheritance mechanic only.
When an instance is initiated like this driver = webdriver.Firefox(options=options) webdriver.Firefox's __init__ takes the passed options argument and writes it to the instance's namespace.

But, if there is new Get_selenium_dynamic_data class that has __init__ of its own then webdriver.Firefox's __init__ is going to be rewritten, and there would be no tool to write the options object to the instance namespace in a proper way.

So the solution to the problem is easy and trivial: we need to just take a piece of the webriver.Firefox's __init__ that works with options and reuse it in Get_selenium_dynamic_data. The best way to do in is super() function.

Final working code looks like this:

class Get_selenium_dynamic_data(webdriver.Firefox):
    
    def __init__(self, teardown=True, headless=False):

        if headless:
            opt = Options()
            opt.headless = True
            super(Get_selenium_dynamic_data, self).__init__(options=opt)

We can initiate an instance like this:

with Get_selenium_dynamic_data(headless=True) as driver:
with headless as boolean argument.



Answered By - Dmitriy Neledva
Answer Checked By - Robin (PHPFixing Admin)
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg
Newer Post Older Post Home

0 Comments:

Post a Comment

Note: Only a member of this blog may post a comment.

Total Pageviews

Featured Post

Why Learn PHP Programming

Why Learn PHP Programming A widely-used open source scripting language PHP is one of the most popular programming languages in the world. It...

Subscribe To

Posts
Atom
Posts
Comments
Atom
Comments

Copyright © PHPFixing