Продолжайте обновлять страницу, пока элемент не станет интерактивным?

#python #selenium #selenium-chromedriver

#python #селен #selenium-chromedriver

Вопрос:

В настоящее время я пытаюсь заставить свой код продолжать обновлять страницу до тех пор, пока определенный элемент на веб-сайте не станет интерактивным. Пример кода приведен ниже:

 lolSize = False
           

while not lolSize:
      try:
          if size.is_enabled():
               driver.execute_script("arguments[0].click();", size)
               lolSize = True
      except:
          time.sleep(1)
          driver.refresh()
        
        
 

Теперь, если я введу значение, которое доступно для просмотра в момент запуска кода, оно будет работать просто отлично. Однако, если используется значение, которое в данный момент не доступно для просмотра, страница вообще не обновляется. Прошу прощения, если что-то элементарное неверно в моем коде, я очень новичок в Python. Любая помощь приветствуется, и если вам нужны разъяснения по моей проблеме, не стесняйтесь спрашивать! Спасибо! 🙂

Ответ №1:

Вы должны обработать условие else вашего оператора if

 while not lolSize:
      try:
          assert size.is_enabled()
          driver.execute_script("arguments[0].click();", size)
          lolSize = True
      except:
          time.sleep(1)
          driver.refresh()
 

Утверждение вызовет исключение, если оно неверно, и обновление произойдет в коде обработчика исключений.

Кроме того, я полагаю, что с предоставленным кодом при обновлении is_enabled() код всегда будет вызывать исключение. Вам нужно извлекать элемент размера при каждом обновлении, чтобы не иметь staleElementException . Такое исключение будет повторять ваш код driver.refresh() каждый раз.

ОБНОВЛЕНИЕ Чтобы убедиться, что нет элемента, который можно щелкнуть, используйте WebDriverWait, чтобы получить время для поиска элемента

 from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
 
timeout_in_sec = 5. # how much time to check for a clickable element
wait = WebDriverWait(driver, timeout_in_sec)
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'yourCssPath')))
 

С обновленным кодом, который дает:

 wait = WebDriverWait(driver, timeout_in_sec)

while not lolSize:
      try:
          size = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'yourCssPath')))
          driver.execute_script("arguments[0].click();", size)
          lolSize = True
      except:
          time.sleep(1)
          driver.refresh()
 

Обратите внимание, что это (By.CSS_SELECTOR, 'yourCssPath') должно соответствовать тому, как вы ранее нашли size

Комментарии:

1. Я вижу, интересно. Как бы вы порекомендовали остановить элемент size, имеющий исключение staleElementException в этом сценарии?

2. Просто переместите свой код, который извлекается size = driver.find_element... внутри try / catch

3. Я вижу, у меня все еще не работает lmao. Я не самый умный в программировании, поэтому я ценю помощь. Я в основном поместил то, что извлекало элемент size, как вы сказали, но это просто не работает. Я поместил его в начало попытки незадолго до assert size.is_enabled()

4. Размещение элемента size является правильным. Можете ли вы уточнить, что не работает? Вы попадаете внутрь обработчика исключений или никогда не доходите до этого кода? Элемент просто никогда не включен .. если это так, вы можете рассмотреть возможность использования element_to_be_clickable from expected_conditions

5. Ах, да, извините, я должен был уточнить намного лучше (был в спешке, извините!). По сути, страница продолжает обновляться, даже если присутствует интерактивный элемент.

Ответ №2:

Моя идея для этой проблемы была бы такой :

 while True: 
   try: 
      driver.execute_script("arguments[0].click();")
      break 
   except: 
          time.sleep(1)
          driver.refresh()