Python Selenium POM框架中Select类与Action类的使用及报错解决
问题修复及Selenium POM框架下Select、Action类用法说明
报错原因及修复
你当前遇到的TypeError是因为select_class方法定义了多余的入参select和driver,调用时未传参触发报错。同时原Select类实例化逻辑错误,未绑定对应下拉元素,且HomePage类初始化时已经传入driver存储在self.driver中,无需重复传参。
修正后的HomePage类代码
# 先导入依赖 from selenium.webdriver.support.ui import Select from selenium.webdriver.common.action_chains import ActionChains class HomePage(): def __init__(self, driver): self.driver = driver self.dropdown_locator = 'navDropDown1' # 下拉框元素ID self.link_text_path = 'Link Text' # 点击下拉框方法(仅非select标签模拟下拉需要) def click_on_drop_down(self): self.driver.find_element(value=self.dropdown_locator).click() # 修正后的下拉选择方法,支持多种选择方式,适配不同场景 def select_option_from_dropdown(self, select_type="index", option_value=1): # 定位原生<select>标签元素,传入Select类实例化 dropdown_element = self.driver.find_element(value=self.dropdown_locator) select = Select(dropdown_element) # 根据指定方式选择选项 if select_type == "index": select.select_by_index(option_value) elif select_type == "value": select.select_by_value(option_value) elif select_type == "visible_text": select.select_by_visible_text(option_value)
修正后的调用代码
def test_login_valid(self): driver = self.driver driver.get("https://www.google.com") home_page = HomePage(driver) # 原生select下拉不需要单独点击触发展开,Select类方法会自动处理 home_page.select_option_from_dropdown(select_type="index", option_value=1) # 按文本选择示例:home_page.select_option_from_dropdown(select_type="visible_text", option_value="选项显示文本")
Select类使用注意事项
- Select类仅支持原生
<select>标签实现的下拉框,如果是div/span模拟的自定义下拉框,不能使用Select类,需要手动实现点击下拉、点击对应选项的逻辑 - 三种选择方式按需使用:
select_by_index按下标(从0开始计数)、select_by_value按option标签的value属性值、select_by_visible_text按选项在页面显示的文本 - 不需要手动调用点击下拉框的方法,Select类的内置方法会自动操作对应选项
ActionChains(Action类)在POM中的使用方法
ActionChains用于处理鼠标悬停、拖拽、右键点击、组合键盘按键等复杂交互,在POM框架中可直接封装为页面对应的交互方法,示例如下:
# 封装在HomePage类中的Action方法示例 # 1. 鼠标悬停到指定元素 def hover_on_nav(self): nav_element = self.driver.find_element(value="导航栏元素ID") ActionChains(self.driver).move_to_element(nav_element).perform() # 2. 拖拽元素到目标位置 def drag_source_to_target(self, source_locator, target_locator): source = self.driver.find_element(value=source_locator) target = self.driver.find_element(value=target_locator) ActionChains(self.driver).drag_and_drop(source, target).perform() # 3. 右键点击指定元素 def right_click_element(self, element_locator): ele = self.driver.find_element(value=element_locator) ActionChains(self.driver).context_click(ele).perform()
注意所有ActionChains的操作最后必须调用.perform()方法,操作才会实际执行。
内容的提问来源于stack exchange,提问作者RealMadridFan
相关产品推荐
相关产品推荐

