Selenium在重新加载后单击保存的元素

时间:2015-02-09 18:11:14

标签: python selenium

我怎样才能做这样的事情,假设每次这些"按钮"按下页面正在重新加载

element = driver.find_element_by_xpath("//select[@name='name']")
all_options = element.find_elements_by_tag_name("option")
for option in all_options:
    print("Value is: %s" % option.get_attribute("value"))
    option.click()

此代码是从示例中复制而来的:http://selenium-python.readthedocs.org/en/latest/navigating.html

没有像这样的错误?

selenium.common.exceptions.StaleElementReferenceException: Message: Element not found in the cache - perhaps the page has changed since it was looked up
Stacktrace:
    at fxdriver.cache.getElementAt (resource://fxdriver/modules/web-element-cache.js:8329:1)
    at Utils.getElementAt (file:///tmp/tmpIxNh0L/extensions/fxdriver@googlecode.com/components/command-processor.js:7922:10)
    at fxdriver.preconditions.visible (file:///tmp/tmpIxNh0L/extensions/fxdriver@googlecode.com/components/command-processor.js:8957:11)
    at DelayedCommand.prototype.checkPreconditions_ (file:///tmp/tmpIxNh0L/extensions/fxdriver@googlecode.com/components/command-processor.js:11618:15)
    at DelayedCommand.prototype.executeInternal_/h (file:///tmp/tmpIxNh0L/extensions/fxdriver@googlecode.com/components/command-processor.js:11635:11)
    at DelayedCommand.prototype.executeInternal_ (file:///tmp/tmpIxNh0L/extensions/fxdriver@googlecode.com/components/command-processor.js:11640:7)
    at DelayedCommand.prototype.execute/< (file:///tmp/tmpIxNh0L/extensions/fxdriver@googlecode.com/components/command-processor.js:11582:5)

2 个答案:

答案 0 :(得分:2)

StaleElementReferenceException通常表示页面已更改。您构建的all_options列表不再有效,因为首次单击该选项可能会更改页面。

我会做一些事情,比如构建一个值列表,然后使用Select功能并遍历该值列表:

from selenium.webdriver.support.ui import Select

element = driver.find_element_by_xpath("//select[@name='name']")
all_options = element.find_elements_by_tag_name("option")
optionValue = []
for option in all_options:
    print("Value is: %s" % option.get_attribute("value"))
    optionValue.append(option.get_attribute("value"))

selectBox = Select(driver.find_element_by_xpath("//select[@name='name']"))
for value in optionValue:
    selectBox.select_by_value(value)

答案 1 :(得分:0)

您可能需要以不同的方式进行此操作,每次页面加载时,您的元素列表都是脏的并且不再存在。因此,似乎你应该遍历所有元素获取它们的值并将其存储在列表中。然后,您应该迭代该列表,以便根据其xpath值找到元素,这些元素的值与列表中的值相同。然后单击该元素。这样您就没有过期元素的列表,但是您可以使用可用于构建有效xpath表达式的值列表来执行相同的操作。