Я пытаюсь написать сценарий Python с Selenium для автозаполнения формы.

Есть несколько полей с автозаполнением. Я могу заполнить их и выбрать следующее:

field1 = driver.find_element_by_id("field-1")
field1.send_keys("input")
driver.find_element_by_xpath("//ul[1]/li[1]") #this clicks on the first autocomplete option

Это прекрасно работает.

Однако, чтобы перейти к следующей форме, мне нужно сначала смоделировать щелчок и обычно задержку на 5-8 секунд:

driver.find_element_by_xpath("//body").click()
time.sleep(delay)

Задержка обычно устанавливается на 8 секунд - хоть и меньше, и, кажется, время от времени она не срабатывает.

Есть ли более эффективный способ сделать это, избегая использования временной задержки?

Я подумал, что, возможно, мне нужно выйти из формы / позволить Selenium подтвердить, что автозаполнение было выбрано.

1
Mozzarelli 18 Апр 2020 в 10:52

1 ответ

Лучший ответ

Вы можете использовать WebDriverWait, чтобы дождаться, пока элемент будет расположен в новой форме. Таким образом, вам не придется явно объявлять функцию задержки, и код возобновит выполнение, как только появится новая форма.

Образец кода

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

browser = webdriver.Firefox()
browser.get("url")
delay = 3 # seconds
driver.find_element_by_xpath("//body").click()
try:
    myElem = WebDriverWait(browser, delay).until(EC.presence_of_element_located((By.ID, 'IdOfMyElement')))
    print "new form is ready!"
    # add your code here
except TimeoutException:
    print "Loading took too much time!"

Вы также можете использовать любой другой метод поиска локатора.

0
AzyCrw4282 18 Апр 2020 в 09:05