Selenium等到具有给定类的任何元素都可见

时间:2014-04-16 19:11:46

标签: python selenium autocomplete

我正在编写一些Selenium测试以确保我的自动填充功能正常工作,我需要在输入字段中输入文本和尝试从自动完成中选择之间稍加延迟。我宁愿等到列表出现,而不仅仅是使用固定的延迟。我尝试过以下方法:

input_element.send_keys("zanzibar c")
WebDriverWait(self.selenium, 10).until(EC.visibility_of_element_located((By.CLASS_NAME, "pac-container")))
input_element.send_keys(Keys.DOWN)

其中pac-container是自动填充列表元素的类。

这适用于带有自动完成功能的第一个输入,但其余时间则超时。我猜这种情况正在发生,因为它正在等待第一个pac-container可见,而我希望它等待任何其中一个pac-container来是可见的。

有没有办法等到至少有一个具有给定类的元素可见?

3 个答案:

答案 0 :(得分:1)

我想这就是你要找的presence_of_all_elements_located(locator)

class selenium.webdriver.support.expected_conditions.presence_of_all_elements_located(locator)[source]
  

期望检查是否存在至少一个元素   在网页上。 locator用于查找返回列表的元素   WebElements一旦找到它们

参考:http://selenium.googlecode.com/git/docs/api/py/webdriver_support/selenium.webdriver.support.expected_conditions.html

答案 1 :(得分:0)

编辑:WebDriverWait没有“等待其中一个可见”的内容。

有两种方法可以找到第一个可见元素。简单的方法是使用JQuery / Javascript选择它:

$('.pac-container').not(':hidden').click();

第二种方法是获取元素列表并迭代它们,检查它们是否可见:

for element in driver.find_elements_by_class_name("pac-container"):
    if element.is_displayed():
        element.do_something()

这两个都需要在一个无限的while循环中,一旦你找到了元素就会突然出现。

答案 2 :(得分:0)

我正在使用Python绑定,下面的函数允许您传入一个等待的定位器列表。

以下是两个定位器和定位器列表的示例:

Amazon S3 service master key

以下是我如何调用该函数:

no_records_indicator_loc = (By.XPATH, "//*[contains(text(),'No records to display')]")
edit_button_loc =  (By.XPATH, "//*[@value='Edit']")
locators = [Customer.no_records_indicator_loc, Customer.edit_button_loc]

这是函数

wait_for_one_these_elements_to_be_present(locators)

说明:

如果在时间到期之前找到任何内容,则该函数返回。如果没有,它会引发NoSuchElementException。从技术上讲,时间表现得更像迭代器,但它对我来说足够接近。

列表是迭代完成的。如果在页面上找到列表中的任何项目,则该函数会中断并返回。如果未找到列表中的定位符,则如果总时间已过,则引发NoSuchElementException。如果还有时间继续检查页面。重复。