Selenium导入定位器报错:无法找到cookie按钮元素
问题分析与解决:元素定位器独立存放后触发“no such element”错误
问题根源
- 多driver实例冲突:你在
footer_locators.py里单独初始化了一个driver,和测试用例里的driver是两个完全独立的浏览器进程——定位器用的是这个没访问目标页面的空浏览器,自然找不到元素。 - 提前执行元素查找:
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
相关产品推荐
相关产品推荐

