迭代重新获取的元素列表

时间:2015-05-28 08:36:40

标签: python list selenium selenium-webdriver

我有:两个未使用和已使用元素的列表。我必须从第一个到第二个传输精确元素(元素可以通过双击或点击+按钮传输,而不是从“未使用的元素”中消失并出现在“已使用的元素”中)。发现每次传输元素时都会重新获取第一个列表。

for x in range(0, len(offers)):
    try:
        if "21796" in offers[x].get_attribute('text'):
            ActionChains(app.driver).double_click(offers[x]).perform()
            offers = app.driver.find_elements_by_css_selector('select[name="unused_offers[]"]>option')
    except IndexError:
        break

所以我在初始报价列表的长度范围内运行循环,并且存在两个问题:

1)如果我不会重新获取“优惠”列表,我会获得StaleElementException

2)如果我这样做,我将退出初始报价列表范围,因为每次迭代'报价'列表变短。

我决定通过2)方式处理IndexError例外。

问题:是否有更好的方法来遍历列表,这比迭代范围更短?

我也尝试了

ActionChains(app.driver).key_down(Keys.CONTROL, offers[x]).click(offers[x]).key_up(Keys.CONTROL, offers[x]).perform()

在循环中重新获取转义列表但是存在问题 - 循环只是逐个单击元素(看起来CTRL并没有真正保留。

1 个答案:

答案 0 :(得分:2)

我会做一个"无休止的"循环,在每次迭代时找到商品,并在找不到商品后退出循环(NoSuchElementException异常被引发)。实现:

from selenium.common.exceptions import NoSuchElementException

while True:
    try:
        offer = app.driver.find_element_by_xpath('//select[@name="unused_offers[]"]/option[contains(@text, "21796")]')
    except NoSuchElementException:
        break

    ActionChains(app.driver).double_click(offer).perform()