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