【发布时间】: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 方法调用上抛出陈旧元素还在更新中。