Python + Selenium: подождите, пока элемент не будет полностью загружен
Итак, я пытался поиграть с функцией в Selenium, которая вызывается:
wait = WebDriverWait(browser, 20).wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="accountStandalone"]/div/div/div[2]/div/div/div[1]/button')))
wait.click()
Прежде чем я начну говорить о проблеме. Что я пытаюсь сделать с Selenium, так это в основном создать Selenium, который автоматически записывает в forumlar на этом рисунке:
Что не вызывает никаких сложностей. Однако всякий раз, когда я нажимаю "Skapa Konto", он загружается и ждет, пока не появится новая страница, которая:
Как показано на рисунке выше. Моя идея заключается в том, что я хочу, чтобы он подождал, пока не выдаст мне эту "картинку" (которая является той же ссылкой, поэтому не вносит никаких изменений), поэтому я предполагаю, что лучше подождать, пока в браузере появится текст etc "FORTSÄTT или HELLO". Затем продолжайте.
Однако при попытке использования этого у меня возникает проблема. Причина в том, что он не ждет, пока не будет найден, а запускается мгновенно и выполняет другие действия, которые не должны выполняться. Прямо сейчас он просто пропускает ожидание, как будто функция не работает или существует вообще. Что я сделал не так?
Обновить:
Что я знаю, так это то, что всякий раз, когда я пытаюсь зарегистрироваться на веб-сайте, веб-сайт не меняется, что означает, что он переводит меня на новую страницу, когда это была успешная учетная запись. Но он автоматически обновляется и сообщает, что это было успешно. Это означает, что каким-то образом я хочу сделать что-то таким образом, чтобы оно проверяло, не произошло ли чего-то нового со страницей. Если нет, подождите еще раз и попробуйте снова ?... Что-то в этом роде?
Что я бы сделал, так это проверил etc, есть ли:
<div class="confirmation-title nsg-font-family--platform nsg-text--black edf-title-font-size--xlarge js-confirmationTitle">NU ÄR DU MEDLEM, Hello.</div>
или
<button type="button" class="nsg-button nsg-bg--black register-next-step-cta js-nextStepCta">FORTSÄTT</button>
Однако проблема, как я уже сказал, в том, что всякий раз, когда я нажимаю "SKAPA KONTO", он просто ждет, пока сервер перепроверит, а затем автоматически обновляет страницу и сообщает об успешном выполнении.
Переведено автоматически
Ответ 1
First of all I strongly believe you were pretty close. You simply need to format your code in a Pythonic which may solve your issue straight away as follows :
WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="accountStandalone"]/div/div/div[2]/div/div/div[1]/button'))).click()
You have pulled a rug over the actual issue by mentioning it doesn't wait until it found but goes instant and does other stuff which it shouldn't rather than mentioning what your program is supposed to do (e.g. your code trials) and what wrong your program is doing (i.e. error stack trace).
As per the HTMLs you have shared you can induce a waiter for either of the WebElements as follows :
Waiter for the visibility of the text NU ÄR DU MEDLEM, Hello. :
CSS_SELECTOR :
WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.confirmation-title.nsg-font-family--platform.nsg-text--black.edf-title-font-size--xlarge.js-confirmationTitle")))
XPATH :
WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='confirmation-title nsg-font-family--platform nsg-text--black edf-title-font-size--xlarge js-confirmationTitle' and contains(.,'NU ÄR DU MEDLEM, Hello.')]")))
Waiter for the button with text FORTSÄTT :
CSS_SELECTOR :
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.nsg-button.nsg-bg--black.register-next-step-cta.js-nextStepCta")))
XPATH :
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@class='nsg-button nsg-bg--black register-next-step-cta js-nextStepCta' and contains(.,'FORTSÄTT')]")))