Selenium WebDriver如何点击两个元素中最先出现的那个?
解决Selenium点击最先出现的两个元素之一的问题
原代码的核心问题是使用了locator or locator2这种Python逻辑或,它只会返回第一个有效的定位器,导致WebDriverWait只会等待第一个元素,只有当第一个元素超时未出现时才会结束等待,不会同时监听第二个元素的状态。
要实现任意一个元素显示就立即点击的需求,需要用Selenium的EC.or_条件组合两个元素的可见性检查,让WebDriverWait同时监听两个元素的状态,只要其中一个满足可见条件就立即触发操作。
修正后的代码如下:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class SeleniumExtended: def __init__(self, driver): self.driver = driver self.default_timeout = 15 def wait_and_click_on_1_of_2_elements(self, locator, locator2, timeout=None): timeout = timeout if timeout else self.default_timeout # 组合两个可见性条件,任意一个满足就返回对应元素 element = WebDriverWait(self.driver, timeout).until( EC.or_( EC.visibility_of_element_located(locator), EC.visibility_of_element_located(locator2) ) ) element.click()
关键说明:
EC.or_(*conditions):该方法会接收多个预期条件,只要其中任意一个条件满足,就会立即返回对应的元素,而不是等待所有条件或按顺序等待。- 轮询机制:WebDriverWait默认每隔0.5秒检查一次条件,所以只要两个元素中有一个在超时时间内变为可见,就会立刻被点击,无需等待第一个元素超时。
- 如果需要等待元素可点击而非仅可见,可以将
visibility_of_element_located替换为element_to_be_clickable,根据实际需求调整。
内容的提问来源于stack exchange,提问作者Roy idiot
相关产品推荐
相关产品推荐

