You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

错误原因

  1. 继承方式错误:直接继承webdriver.Opera(options=op)会在类定义时就实例化浏览器驱动,而非创建类实例时初始化,导致参数传递混乱触发port格式化错误。
  2. 选项与驱动不匹配:混用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 12:55:25