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

Selenium导入定位器报错:无法找到cookie按钮元素

问题分析与解决:元素定位器独立存放后触发“no such element”错误

问题根源

  1. 多driver实例冲突:你在footer_locators.py里单独初始化了一个driver,和测试用例里的driver是两个完全独立的浏览器进程——定位器用的是这个没访问目标页面的空浏览器,自然找不到元素。
  2. 提前执行元素查找:locators类的cookie_button属性在类定义阶段就调用了driver.find_element(),这时候浏览器还没打开otomoto.pl页面,元素根本不存在,直接触发找不到元素的错误。

修复方案1:将定位器存储为定位策略元组

只在外部文件保存定位规则,不提前执行元素查找操作,在测试用例中用当前活跃的driver完成定位。

修改footer_locators.py:

from selenium.webdriver.common.by import By

class locators:
    # 存储定位策略+表达式的元组,不执行实际查找
    cookie_button = (By.XPATH, "//button[@id='onetrust-accept-btn-handler']")
    facebook_link = (By.XPATH, "//a[normalize-space()='Facebook']")

修改测试用例代码:

import unittest
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from footer_locators import locators


service = Service("C:\Users\Hubert\Downloads\chromedriver.exe")
driver = webdriver.Chrome(service=service)


class TestScenario_footer(unittest.TestCase):
    def setUp(self) -> None:
        driver.implicitly_wait(10)
        driver.maximize_window()
        driver.get("https://www.otomoto.pl/")

    def tearDown(self) -> None:
        driver.quit()

    def test_TC01_check_facebook(self):
        # 用当前driver,通过元组定位元素
        driver.find_element(*locators.cookie_button).click()
        main_page = driver.current_window_handle
        driver.find_element(*locators.facebook_link).click()
        for window_handle in driver.window_handles:
            if window_handle != main_page:
                driver.switch_to.window(window_handle)
        print(driver.current_url)
        assert driver.current_url == "https://www.facebook.com/otomotopl"

修复方案2:使用页面对象模式(POM)封装

把页面元素和操作逻辑封装成类,初始化时接收测试用例的driver实例,保证操作的是同一个浏览器窗口。

修改footer_locators.py为页面对象类:

from selenium.webdriver.common.by import By

class FooterPage:
    def __init__(self, driver):
        self.driver = driver
        # 定义定位器
        self.cookie_button_locator = (By.XPATH, "//button[@id='onetrust-accept-btn-handler']")
        self.facebook_link_locator = (By.XPATH, "//a[normalize-space()='Facebook']")

    def accept_cookies(self):
        self.driver.find_element(*self.cookie_button_locator).click()

    def click_facebook_link(self):
        self.driver.find_element(*self.facebook_link_locator).click()

修改测试用例代码:

import unittest
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from footer_locators import FooterPage


service = Service("C:\Users\Hubert\Downloads\chromedriver.exe")
driver = webdriver.Chrome(service=service)


class TestScenario_footer(unittest.TestCase):
    def setUp(self) -> None:
        driver.implicitly_wait(10)
        driver.maximize_window()
        driver.get("https://www.otomoto.pl/")
        # 实例化页面对象,传入当前driver
        self.footer_page = FooterPage(driver)

    def tearDown(self) -> None:
        driver.quit()

    def test_TC01_check_facebook(self):
        self.footer_page.accept_cookies()
        main_page = driver.current_window_handle
        self.footer_page.click_facebook_link()
        for window_handle in driver.window_handles:
            if window_handle != main_page:
                driver.switch_to.window(window_handle)
        print(driver.current_url)
        assert driver.current_url == "https://www.facebook.com/otomotopl"

内容的提问来源于stack exchange,提问作者Hubert Łuczak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:09:13