Веб-драйвер Selenium с python для очистки динамической страницы не может найти элемент

Итак, есть много вопросов, которые были заданы по поводу динамического парсинга контента в stackoverflow, и я прошел все это, но все предложенные решения не сработали для следующей проблемы:

Контекст:

Проблема:

Мне не удалось получить доступ ни к одному из элементов DOM на этой странице. Обратите внимание, если бы я мог получить несколько подсказок о том, как получить доступ к панели поиска и кнопке поиска, это было бы отличным началом. См. страницу для очистки В конечном итоге я хочу просмотреть список адресов, запустите поиск и скопируйте информацию, отображаемую в правой части экрана.

Я пробовал следующее:

  • Сменил браузер для webdriver (с Chrome на Firefox)
  • Добавлено время ожидания загрузки страницы

    try:
        WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.ID, "addressInput")))
    except:
        print "address input not found"
    
  • Пытался получить доступ к элементу по ID, XPATH, NAME, TAG NAME и т. Д., Ничего не вышло.

Вопросы

  • Что еще я мог попробовать, чего у меня еще не было (используя Selenium webdriver)?
  • Неужели некоторые веб-сайты невозможно очистить? (Я не думаю, что город использовал алгоритм для генерации случайной модели DOM каждый раз, когда я перезагружаю страницу).

person Audrey Bascoul    schedule 28.03.2016    source источник
comment
найти поле поиска одним из методов find_by_ *, отправить Keys.ENTER   -  person Corey Goldberg    schedule 29.03.2016
comment
Проблема заключалась в том, что он не мог найти элементы ... не о том, как отправлять ключи.   -  person Audrey Bascoul    schedule 29.03.2016
comment
ваш вопрос состоял из двух частей: если бы я мог получить несколько подсказок о том, как получить доступ к панели поиска, и кнопке поиска ... Я предоставил различные методы для поиска (find_by_*), чтобы найти элемент. (в принятом ответе выбрано find_element_by_id). Также обратите внимание, что нажатие клавиши Enter для обхода поиска элемента и имитации щелчка на практике оказывается быстрее и надежнее.   -  person Corey Goldberg    schedule 30.03.2016


Ответы (1)


Вы можете использовать этот URL http://50.17.237.182/PIM/ для получения источника:

In [73]: from selenium import webdriver


In [74]: dr = webdriver.PhantomJS()

In [75]: dr.get("http://50.17.237.182/PIM/")

In [76]: print(dr.find_element_by_id("addressInput"))
<selenium.webdriver.remote.webelement.WebElement object at 0x7f4d21c80950>

Если вы посмотрите на возвращенный источник, там есть атрибут кадра с этим URL-адресом src:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
   "http://www.w3.org/TR/html4/strict.dtd">
<html>

<head>
  <title>San Francisco Property Information Map </title>
  <META name="description" content="Public access to useful property information and resources at the click of a mouse"><META name="keywords" content="san francisco, property, information, map, public, zoning, preservation, projects, permits, complaints, appeals">
</head>
<frameset rows="100%,*" border="0">
  <frame src="http://50.17.237.182/PIM" frameborder="0" />
  <frame frameborder="0" noresize />
</frameset>

<!-- pageok -->
<!-- 02 -->
<!-- -->
</html>

Благодаря @Alecxe, самый простой способ использовать dr.switch_to.frame(0):

In [77]: dr = webdriver.PhantomJS()

In [78]: dr.get("http://propertymap.sfplanning.org/")

In [79]:  dr.switch_to.frame(0)  

In [80]: print(dr.find_element_by_id("addressInput"))
<selenium.webdriver.remote.webelement.WebElement object at 0x7f4d21c80190>

Если вы зайдете на http://50.17.237.182/PIM/ в своем браузере, вы увидите то же самое, что и propertymap.sfplanning.org/, с той лишь разницей, что у вас есть полный доступ к элементам, использующим первый.

Если вы хотите ввести значение и щелкнуть поле поиска, это будет примерно так:

from selenium import webdriver


dr = webdriver.PhantomJS()
dr.get("http://propertymap.sfplanning.org/")

dr.switch_to.frame(0)

dr.find_element_by_id("addressInput").send_keys("whatever")
dr.find_element_by_xpath("//input[@title='Search button']").click()

Но если вы хотите получить данные, вам может показаться, что запрос с использованием URL-адреса является более простым вариантом, вы получите обратно некоторый json из запроса.

введите здесь описание изображения

person Padraic Cunningham    schedule 28.03.2016
comment
Думаю, тебе просто нужно переключиться на iframe: driver.switch_to.frame(0), верно? - person alecxe; 29.03.2016
comment
@alecxe, ага, было бы проще :) - person Padraic Cunningham; 29.03.2016
comment
@PadraicCunningham: большое спасибо, это красиво - я злюсь на себя, потому что никогда не думал о том, чтобы посмотреть на это. Я потратил на это 2 полных дня ... - person Audrey Bascoul; 29.03.2016
comment
@AudreyBascoul, пожалуйста, изображение не самое лучшее в конце, но если вы откроете инструменты firebig или chrome dev и проследите за сетевыми запросами, вы получите более четкую картину того, что происходит. - person Padraic Cunningham; 29.03.2016
comment
@PadraicCunningham, спасибо! Иногда использую Fiddler. Хорошее примечание об использовании URL-адреса для отправки запроса :) - person Audrey Bascoul; 29.03.2016