在 Python 中使用 Selenium 检索数据的结果不一致

Inconsistent results retrieving data with Selenium in Python

driver = webdriver.Chrome(driver_path, options=chrome_options)
wait = WebDriverWait(driver, 20)

driver.get('https://%s/' % asset_id)

wait.until(EC.presence_of_element_located((By.XPATH, "//*[@id='dev_diaginfo_fid']")))

print(driver.find_element_by_xpath('//*[@id='dev_diaginfo_fid']").get_attribute=("innerHTML"))

我可以登录网站和 Selenium returns WebElement,但是从该 WebElement 返回文本时它不一致。有时它 returns 它和其他时候它似乎加载速度不够快(正在使用它的网络速度很慢)并且 returns 根本没有数据但我仍然可以看到 WebElement 本身只是没有数据。数据通过JS动态加载。可能不相关,但我正在使用 send_keys 传递登录所需的凭据,然后加载具有该版本的页面。

有没有办法使用 ExpectedCondition (EC) 等到看到文本后再继续?我试图从网络设备中提取固件版本,它找到了 Firmware 元素,但在返回实际固件版本时它并不一致。如前所述,网络速度偶尔会出现问题,所以我怀疑它在加载固件编号之前正在继续。此设备无法访问互联网,因此我无法共享 URL。我可以确认我已经拉取了固件版本,但它并不一致。

我已经尝试将它传递给 beautifulsoup 并且可以验证它是否看到固件版本:但是内部标签是空的。

编辑:我已经尝试了 EC.visibility_of_all_elements 和 EC.visibility_of_element,但没有成功。

这是一个想法。

尝试 while 循环,直到您看到文本。

counter = 0

elem = driver.find_element_by_xpath("//*[@id='dev_diaginfo_fid']").get_attribute=("innerHTML")

while "" in elem:
    pause(500)
    elem = driver.find_element_by_xpath("//*[@id='dev_diaginfo_fid']").get_attribute=("innerHTML")
    if "" not in elem:
        print("Success! The text is: " + elem)
        break
    if counter > 20:
        print("Text still not found!")
        break
    counter += 1

显然,请根据您的需要调整循环。