Python: почему selenium не может найти элемент на сайте AngularJS?

#python #selenium #selenium-chromedriver

#python #selenium #selenium-chromedriver

Вопрос:

Я пытаюсь использовать selenium в окне поиска на этом сайте:https://www.claytoncountyga.gov/government/sheriff/inmate-search

 def clayton_search(last, first, middle):
    print("Clayton County Jail")
    url = "https://www.claytoncountyga.gov/government/sheriff/inmate-search"
    driver = webdriver.Chrome(chrome_options=(), executable_path="/usr/bin/chromedriver")
    driver.get(url)
    wait = WebDriverWait(driver, 30)
    wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#name")))
    driver.find_element_by_css_selector("#name").send_keys(last," ",first, " ", middle, Keys.ENTER)    
    return driver

driver = clayton_search(last, first, middle)
  

Сайт использует AngularJS, и я знаю, что на сайтах AngularJS selenium не увидит элементы see, если вы не скажете ему подождать, пока элемент не станет видимым. Например:

 wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#name")))
  

Но я получаю исключение тайм-аута. Я попытался найти элемент с помощью селектора CSS, XPATH и ID.

Хотя трассировка стека не указала, что он может скрываться за другим элементом. Я тоже пробовал это, используя: driver.execute_script

Я подумал, что, возможно, всплывающее меню из панели навигатора может закрывать его, но оно появляется только тогда, когда курсор находится над панелью навигации.

Почему я не могу использовать wait.until(EC.visibility_of_element_located для поиска элемента на этом сайте AngularJS?

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

1. элемент #name находится внутри iframe — поскольку Selenium элементы в iframe не являются частью страницы. Вы должны найти iframe и switch_to() в этом фрейме, чтобы найти элемент в этом iframe

Ответ №1:

Существует iframe, который не позволяет вам получить доступ к элементу.Сначала вы должны переключить iframe. попробуйте приведенный ниже код.

 def clayton_search(last, first, middle):
    print("Clayton County Jail")
    url = "https://www.claytoncountyga.gov/government/sheriff/inmate-search"
    driver = webdriver.Chrome(chrome_options=(), executable_path="/usr/bin/chromedriver")

    driver.get(url)
    wait = WebDriverWait(driver, 30)
    wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID,"Clayton County")))
    wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#name")))
    driver.find_element_by_css_selector("#name").send_keys(last," ",first, " ", middle, Keys.ENTER)
    return driver
  

Ответ №2:

Эта страница имеет #name in iframe и Selenium не выполняет поиск в iframe .
Сначала вам нужно switch_to.frame() , а затем вы можете выполнить поиск внутри iframe

 import selenium.webdriver

url = "https://www.claytoncountyga.gov/government/sheriff/inmate-search"
driver = selenium.webdriver.Firefox()
driver.get(url)

iframes = driver.find_elements_by_tag_name('iframe')
#print('iframes:', iframes)

driver.switch_to.frame(iframes[0])

item = driver.find_element_by_id('name')
#print('name:', item)
item.send_keys("John")

item = driver.find_element_by_name('NameSearch')
#print('name:', item)
item.click()