I'm refactoring my app from procedural code to OOP. I am trying to do this Driver class.
UPDATE: this works in Windows but not in Mac.
# IMPORTS
from sys import platform
import os
from os import system
from selenium import webdriver
from selenium.webdriver import Firefox, FirefoxOptions
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
# import Action chains
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import Select
from selenium.webdriver.firefox.service import Service
class Driver():
def __init__(self):
#set executable path to driver
self.dirname = os.path.dirname(__file__)
if platform == "win32":
self.executable_path = os.path.join(self.dirname, 'geckodriver.exe') #must save the gecko file to same directory where python is. path to geckodriver (firefox drive/motor) on your machine
print("Gecko (Firefox) filepath is: ", self.executable_path)
if platform == "darwin":
self.executable_path = os.path.join(self.dirname, 'geckodriver') #must save the gecko file to same directory where python is. path to geckodriver (firefox drive/motor) on your machine
print("Gecko (Firefox) filepath is: ", self.executable_path)
self.service_path = Service(self.executable_path)
self.opts = FirefoxOptions()
#self.opts.add_argument(f"--width={int(screen_width/4)}")
#self.opts.add_argument(f"--height={int(screen_height/2)}")
self.driver = Firefox(service=self.service_path, options=self.opts)
self.driver.set_window_position(-10, 0)
self.driver.get("https://google.com/")
Driver()
This will give me the following error:
Traceback (most recent call last):
File "/driverClass.py", line 72, in <module>
Driver()
File "/driverClass.py", line 66, in __init__
self.driver = Firefox(service=self.service, options=self.opts)
TypeError: __init__() got an unexpected keyword argument 'service_path'
Why is this? I'm refactoring my code to OOP. The code worked before when using procedural code.
This is from the working code:
# driver configs
service = Service(executable_path) #pass in path to geckodriver
opts = FirefoxOptions()
#opts.add_argument(f"--width={int(screen_width/4)}")
#opts.add_argument(f"--height={int(screen_height/2)}")
driver = Firefox(service=service, options=opts)
driver.set_window_position(-10, 0)
#driver.set_window_size(int(screen_width/4), int(screen_height))
driver.get("https://google.com/")
CodePudding user response:
This error message...
TypeError: __init__() got an unexpected keyword argument 'service_path'
...implies that service_path is an unexpected keyword argument.
The possible reason, you are still using Selenium v3.x and the keyword argument service
wasn't supported.
Solution
Since Selenium 4.0 Beta 1:
Deprecate all but
OptionsandServicearguments in driver instantiation. (#9125,#9128)
So you need to upgrade to Selenium 4.x
References
You can find a couple of relevant detailed discussion in:
CodePudding user response:
self.driver = Firefox(service=self.service, options=self.opts)
The Firefox webdriver doesn't take a service keyword argument: https://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.firefox.webdriver
It would be helpful to see the older working version.
CodePudding user response:
As you can see when you call
Firefox(service=self.service, options=self.opts)
it raises because Firefox class does not accept service kwarg
If you are trying to set up a Firefox web driver you can see similar question
