Как send_keys в элементе поля поиска второй раз, который существует - PullRequest
0 голосов
/ 28 мая 2020

Сайт https://www.webstaurantstore.com/25887/commercial-gas-ranges.html?page=1. Когда я хочу локализовать поле поиска в правом верхнем углу и отправить туда ключи, это работает. Но когда я хочу выполнить ту же операцию после выполнения одного поиска, она не работает. selenium может находить элемент, но не может отправлять к нему ключи. Почему происходит подобное и как этого избежать?

while True:
    try:
    a = self.webdriver.find_element_by_xpath('/html/body/div[3]/div[1]/div[2]/div[2]/div/div[2]/div/form/div/input')
    except:
        pass
    else:
        a.send_keys(i.text[1:])
        break

Ошибка:

>>>selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
  (Session info: chrome=81.0.4044.138)

Ответы [ 3 ]

0 голосов
/ 28 мая 2020

poll_frequency-спать между вызовами и обновлять sh вашу страницу, если вы поймаете исключение.

 try:
        wait = WebDriverWait(driver, 5, poll_frequency=1)
        a = self.webdriver.find_element_by_xpath('/html/body/div[3]/div[1]/div[2]/div[2]/div/div[2]/div/form/div/input')
        element = wait.until(expected_conditions.visibility_of_element_located(a))
    except:
        driver.refresh()
0 голосов
/ 28 мая 2020

Чтобы отправить последовательность символов в поле Search второй раз после первого поиска с использованием Selenium , вам необходимо вызвать WebDriverWait для element_to_be_clickable(), и вы можете использовать любую из следующих Стратегий локатора :

  • CSS_SELECTOR:

    driver.get("https://www.webstaurantstore.com/25887/commercial-gas-ranges.html?page=1")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[name='searchval']"))).send_keys("Oven")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[value='Search']"))).click()
    search = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[name='searchval']")))
    search.click()
    search.clear()
    search.send_keys("Bowls")
    
  • XPATH:

    driver.get("https://www.webstaurantstore.com/25887/commercial-gas-ranges.html?page=1")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@name='searchval']"))).send_keys("Oven")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@value='Search']"))).click()
    search = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@name='searchval']")))
    search.click()
    search.clear()
    search.send_keys("Bowls")
    
  • Примечание : вам необходимо добавить следующие импорты:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
0 голосов
/ 28 мая 2020

Я считаю, что проблема в том, что упомянутый вами элемент был удален из DOM.

Вот почему вы получаете исключение, сам элемент больше не существует, даже если он отображается в пользовательском интерфейсе. Вы можете использовать команду try / catch с тем же блоком инструкций.

try:
    line1
    line1
    ...

except:
    line1
    line1
    ...

Это простая идея для решения проблемы, подобной вашей, но не лучшее решение, я обновлю свой ответ, если у меня будет лучше, чем это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...