【问题标题】:Selenium wait until attribute appearsSelenium 等到属性出现
【发布时间】:2021-11-08 17:09:27
【问题描述】:

我正在使用 Selenium 下载多个文件。过程很简单:我寻找参考,等到结果准备好并下载相关文件。

我对“等到结果准备好”部分有疑问。该网站使用加载结果的 AJAX 表。在此表的更新过程中,一个属性会出现在 HTML 代码中,当结果准备好时它会消失。

对象始终存在,只是属性发生变化。如果我在单击搜索按钮后立即执行下一个循环:

for i in range(0,10):
    print(self.driver.find_element(By.ID, "gridpoOverview").get_attribute("aria-busy"))
    time.sleep(0.05)

它返回(所以我知道如何检测它):

none 
true
true
none
none
none
none
none
none
none

我想用 EC 来做,但是下一个代码不起作用(超时异常):

WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.XPATH, '//div[@id="gridpoOverview" and @aria-busy="true"]')))

【问题讨论】:

  • this 有帮助吗?
  • 其实这个方法我已经测试过了。问题是对象总是存在的,它只是出现/消失的属性
  • 这是轮询循环吗? (每 x 单位时间更新一次?)或者它只是一个加载指示器?
  • 自从我单击“搜索”按钮后每 0.05 秒,我就会获得 ID 为“gridpoOverview”的元素的属性“aria-busy”。我们可以看到的是,在某一时刻,它变成了“真”(结果正在加载时),而在其余时间它不存在(这就是它返回“none”的原因)
  • 好的,听起来它只是一个“加载”指示器。您应该只使用 webdriverwait 来获取加载完成后应该显示的内容。确保捕获过时元素异常并在捕获时重新获取 Web 元素。您可以使用类似这样的答案:stackoverflow.com/questions/66820416/…(或者创建一个函数并尝试/捕获...如果捕获到陈旧元素,则重新调用函数。)关键是如果 DOM,则将在 webelement 方法调用上抛出陈旧元素还在更新中。

标签: python selenium


【解决方案1】:

看来你已经够近了。

get_attribute("aria-busy") 返回的 aria-busy 属性值变为 True

所以你需要将 true 替换为 True 如下:

WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.XPATH, '//div[@id="gridpoOverview" and @aria-busy="True"]')))

更新

根据您更新的问题,您可以使用:

WebDriverWait(driver, 10).until(EC.staleness_of(driver.find_element_by_xpath("//div[@id="gridpoOverview" and not(@aria-busy)]")))

或者

WebDriverWait(driver, 10).until(EC.staleness_of(driver.find_element(By.XPATH, "//div[@id="gridpoOverview" and not(@aria-busy)]")))

【讨论】:

  • 对不起,输入错误
  • 这个答案能解决你的问题吗?
  • 对不起,没有……
  • 如果您正在下载/更新表格并单击某个元素,您是如何捕捉到第一个 none 的?
  • 因为在循环中我使用了“get_attribute”方法,所以我可以捕捉到属性何时出现(它的值为“true”),其余时间返回“none”因为结果已经加载了还没有开始搜索
【解决方案2】:

我找到了一个可行的解决方案,但我不知道为什么。

同一元素的“aria-disabled”属性始终存在。如果我包括 这行之前,它会工作。

    WebDriverWait(self.driver, 20).until(EC.element_attribute_to_include((By.XPATH, '//div[@id="gridpoOverview"]'),'aria-disabled'))
    WebDriverWait(self.driver, 20).until(EC.element_attribute_to_include((By.XPATH, '//div[@id="gridpoOverview"]'),'aria-busy'))

如果第一行不存在,则它不起作用(我有超时异常)。

有人知道为什么吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2015-08-29
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    相关资源
    最近更新 更多