Python OOP代码中如何实现Selenium浏览器Headless选项?
解决Selenium OOP范式下Headless模式初始化报错问题
你在面向对象代码中实现浏览器Headless选项时遇到报错,已知函数式写法可行,但OOP继承时出错。核心需求是让浏览器在后台运行,不弹出窗口。
原代码
from selenium import webdriver from selenium.webdriver.common.keys import Keys import os os.environ["PATH"] = "C:\\SeleniumWebDrivers" op = webdriver.ChromeOptions() op.add_argument("--disable-blink-features=AutomationControlled") op.add_argument("headless") class Avamovie(webdriver.Opera(options=op)): def __init__(self, teardown=False): self.teardown = teardown super(Avamovie, self).__init__() self.implicitly_wait(15) self.maximize_window() self.minimize_window() def __exit__(self, exc_type, exc_val, exc_tb) -> None: if self.teardown: self.quit() def get_the_page(self): self.get("https://avamovie17.xyz") def search_box(self, title): sbox = self.find_element_by_css_selector("input[placeholder='جستجو']") sbox.send_keys(title) sbox.click() r = self.find_element_by_css_selector("ul[class='search_result_list']") r = r.find_element_by_tag_name("li").find_element_by_css_selector( "span[class='title']" ) r.click() def download_links(self): links = self.find_elements_by_css_selector("a[href*='.mkv']") links = [link.get_attribute("href") for link in links] print(links) with Avamovie() as scraper: scraper.get_the_page() scraper.search_box("A hero 2021") scraper.download_links()
报错信息
Traceback (most recent call last): File "c:\Users\yasin\Desktop\pf\Projects\Selena\selena.py", line 1, in <module> from sites.avamovie import Avamovie File "c:\Users\yasin\Desktop\pf\Projects\Selena\sites\avamovie.py", line 10, in <module> class Avamovie(webdriver.Opera(options=op)): File "C:\Users\yasin\AppData\Roaming\Python\Python310\site-packages\selenium\webdriver\opera\webdriver.py", line 79, in __init__ OperaDriver.__init__(self, executable_path=executable_path, File "C:\Users\yasin\AppData\Roaming\Python\Python310\site-packages\selenium\webdriver\opera\webdriver.py", line 55, in __init__ ChromiumDriver.__init__(self, File "C:\Users\yasin\AppData\Roaming\Python\Python310\site-packages\selenium\webdriver\chrome\webdriver.py", line 73, in __init__ self.service.start() File "C:\Users\yasin\AppData\Roaming\Python\Python310\site-packages\selenium\webdriver\common\service.py", line 71, in start cmd.extend(self.command_line_args()) File "C:\Users\yasin\AppData\Roaming\Python\Python310\site-packages\selenium\webdriver\chrome\service.py", line 45, in command_line_args return ["--port=%d" % self.port] + self.service_args TypeError: %d format: a real number is required, not dict
错误原因
- 继承方式错误:直接继承
webdriver.Opera(options=op)会在类定义时就实例化浏览器驱动,而非创建类实例时初始化,导致参数传递混乱触发port格式化错误。 - 选项与驱动不匹配:混用
ChromeOptions和Opera驱动,虽Opera基于Chromium,但直接混用易引发兼容性问题。
修正后的代码
from selenium import webdriver from selenium.webdriver.common.keys import Keys import os os.environ["PATH"] = "C:\\SeleniumWebDrivers" class Avamovie(webdriver.Opera): def __init__(self, teardown=False): self.teardown = teardown # 初始化浏览器选项 op = webdriver.ChromeOptions() op.add_argument("--disable-blink-features=AutomationControlled") # 使用Selenium 4.8+推荐的新无头模式,兼容性更强 op.add_argument("--headless=new") # 将选项正确传递给父类构造函数 super().__init__(options=op) self.implicitly_wait(15) # Headless模式下窗口最大化/最小化无意义,可移除 # self.maximize_window() # self.minimize_window() def __exit__(self, exc_type, exc_val, exc_tb) -> None: if self.teardown: self.quit() def get_the_page(self): self.get("https://avamovie17.xyz") def search_box(self, title): sbox = self.find_element_by_css_selector("input[placeholder='جستجو']") sbox.send_keys(title) sbox.click() r = self.find_element_by_css_selector("ul[class='search_result_list']") r = r.find_element_by_tag_name("li").find_element_by_css_selector( "span[class='title']" ) r.click() def download_links(self): links = self.find_elements_by_css_selector("a[href*='.mkv']") links = [link.get_attribute("href") for link in links] print(links) with Avamovie(teardown=True) as scraper: scraper.get_the_page() scraper.search_box("A hero 2021") scraper.download_links()
关键修正点
- 将选项初始化移至
__init__方法内,继承webdriver.Opera类而非其实例,确保创建Avamovie实例时才初始化驱动。 - 通过
super().__init__(options=op)将选项正确传递给父类构造函数。 - 替换
headless为--headless=new,适配新版Selenium的无头模式规范。 - 移除Headless模式下无意义的窗口操作。
- 实例化时显式传入
teardown=True,确保退出上下文时自动关闭浏览器。
内容的提问来源于stack exchange,提问作者Yasin
相关产品推荐
相关产品推荐

