我放弃了 3 次,才终于解决了这个问题。
Selenium 需要等待名为hilight 的类出现在页面上。只有这样它才应该尝试点击它。
为此,我使用了从之前的一个问题中得到的等待功能:
Django: Selenium- stale element reference on browse
我将从一个适用于我的第一个领域的简单方法开始,因为它没有我的最终解决方案那么令人生畏。
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
def wait_for_element(self, elm, by = 'id', timeout=10):
wait = WebDriverWait(self.driver, timeout)
wait.until(EC.presence_of_element_located((By.CLASS_NAME, elm)))
return self.driver.find_element_by_class_name(elm)
wait_for_element(self, "highlight", "class").click()
driver 是用于运行测试的相应 WebDriver。该类在我正在使用的版本的第 245 行的autocomplete.js 中定义:
this.hilightClass = 'hilight';
然而,这很快被证明是无效的,因为连续有多个自动完成字段的表单会留下名为 highlight 的类,从而混淆 webdriver。所以我不得不修改它使用xpath,让它变得更强大:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
def wait_for_element(self, elm, by = 'id', timeout=10):
wait = WebDriverWait(self.driver, timeout)
wait.until(EC.presence_of_element_located((By.XPATH, elm)))
return self.driver.find_element_by_xpath(elm)
wait_for_element(self,
"//span[@data-input-id='id_branch-autocomplete']/span[@data-value='1']",
"xpath").click()
id_branch-autocomplete 应替换为您的字段的id,并且@data-value='x' 的数值可以是您想从下拉列表中选择的任何选项。第一个选项是1,第二个是2,以此类推。太棒了!