Подождите, пока не исчезнет загрузчик python selenium

<div id="loader-mid" style="position: absolute; top: 118.5px; left: 554px; display: none;">
    <div class="a">Loading</div>
    <div class="b">please wait...</div>
</div>

И хочется подождать, пока он не исчезнет. У меня есть следующий код, но он иногда слишком долго ждет, и в какой-то момент кода он внезапно замораживает весь процесс, и я не знаю почему.

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait

self.wait = WebDriverWait(driver, 10)

self.wait.until(EC.invisibility_of_element_located((By.XPATH, "//*[@id='loader_mid'][contains(@style, 'display: block')]")))

а также я пробовал это:

self.wait.until_not(EC.presence_of_element_located((By.XPATH, "//*[@id='loader_mid'][contains(@style, 'display: block')]")))

Я точно не знаю, как это проверить, но, возможно, мой элемент всегда присутствует на странице, и селен думал, что он есть, единственное, что меняется, - это изменение отображения параметров с none на block. Я думаю, что могу получить атрибут, такой как строка, и проверить, есть ли слово "блок", но это так неправильно, я думаю ... Помогите мне, пожалуйста.


person Michael    schedule 28.09.2014    source источник
comment
Вы пробовали проверить видимость элемента, скрытого за загрузчиком?   -  person ExperimentsWithCode    schedule 30.09.2014
comment
Да и мне это не помогло. Но как-то сейчас работает второй вариант. странный.   -  person Michael    schedule 01.10.2014
comment
Да, это довольно странно.   -  person ExperimentsWithCode    schedule 03.10.2014


Ответы (3)


Повторил свой ответ (с некоторой обработкой ошибок), чтобы людям было проще найти решение :)

Импорт необходимых классов:

from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

Переменные конфигурации:

SHORT_TIMEOUT  = 5   # give enough time for the loading element to appear
LONG_TIMEOUT = 30  # give enough time for loading to finish
LOADING_ELEMENT_XPATH = '//*[@id="xPath"]/xPath/To/The/Loading/Element'

Кодовое решение:

try:
    # wait for loading element to appear
    # - required to prevent prematurely checking if element
    #   has disappeared, before it has had a chance to appear
    WebDriverWait(driver, SHORT_TIMEOUT
        ).until(EC.presence_of_element_located((By.XPATH, LOADING_ELEMENT_XPATH)))

    # then wait for the element to disappear
    WebDriverWait(driver, LONG_TIMEOUT
        ).until_not(EC.presence_of_element_located((By.XPATH, LOADING_ELEMENT_XPATH)))

except TimeoutException:
    # if timeout exception was raised - it may be safe to 
    # assume loading has finished, however this may not 
    # always be the case, use with caution, otherwise handle
    # appropriately.
    pass 
person ChickenFeet    schedule 01.12.2016
comment
Это такой гениальный ответ. Я целую вечность боролся с этой точной идеей, и это идеальное решение. Спасибо - person Axle Max; 07.07.2019

Использовать ожидаемое условие: invisibility_of_element_located

У меня это отлично работает.

from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait


WebDriverWait(driver, timeout).until(EC.invisibility_of_element_located((By.ID, "loader-mid")))
person Suraj Shrestha    schedule 25.07.2019

Следующий код создает бесконечный цикл до исчезновения элемента:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException

while True:
        try:
            WebDriverWait(driver, 1).until(EC.presence_of_element_located((By.XPATH, 'your_xpath')))
        except TimeoutException:
            break
person kangsoon93    schedule 25.05.2018
comment
Проблема заключается в том, что элемент, возможно, не успел загрузиться первым, поэтому он мгновенно выйдет из цикла и продолжит работу. Кроме того, бесконечные циклы редко бывают полезными, если нет способа их отменить, и они обычно должны иметь какой-то вид сна внутри цикла, чтобы предотвратить чрезмерное использование ресурсов (ЦП). - person ChickenFeet; 21.09.2018