Selenium WebDriver: Firefox не получает элемент по имени тега - PullRequest
0 голосов
/ 27 июня 2018

Я хочу запускать Firefox без использования Selenium WebDriver в Python.

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

Чтобы начать тестирование, я сделал этот код:

import time 
from selenium import webdriver
from selenium.webdriver.firefox.options import Options


options = Options()
options.add_argument("--headless")

url = "http://localhost:3000/"

driver = webdriver.Firefox(firefox_options=options)
driver.get(url) 
time.sleep(5)

urls = driver.find_elements_by_tag_name('a') 
print(urls)

driver.quit()

Это всегда дает следующую ошибку:

Traceback (most recent call last):
  File "sel.py", line 18, in <module>
    urls = driver.find_elements_by_tag_name('a') 
  File "/home/.local/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 545, in find_elements_by_tag_name
    return self.find_elements(by=By.TAG_NAME, value=name)
  File "/home/.local/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 995, in find_elements
    'value': value})['value'] or []
  File "/home/.local/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 318, in execute
    response = self.command_executor.execute(driver_command, params)
  File "/home/petra/.local/lib/python2.7/site-packages/selenium/webdriver/remote/remote_connection.py", line 472, in execute
    return self._request(command_info[0], url, body=data)
  File "/home/petra/.local/lib/python2.7/site-packages/selenium/webdriver/remote/remote_connection.py", line 496, in _request
    resp = self._conn.getresponse()
  File "/usr/lib/python2.7/httplib.py", line 1136, in getresponse
    response.begin()
  File "/usr/lib/python2.7/httplib.py", line 453, in begin
    version, status, reason = self._read_status()
  File "/usr/lib/python2.7/httplib.py", line 417, in _read_status
    raise BadStatusLine(line)
httplib.BadStatusLine: ''

Я попытался удалить эту строку time.sleep(5), потому что предположил, что это может быть проблемой.

Теперь print(urls) возвращает следующее:

[<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="27257d43-81ec-48e4-9ed2-55709a23d60f", element="e728d5ef-001f-4335-bd57-19a1f2d82683")>, <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="27257d43-81ec-48e4-9ed2-55709a23d60f", element="2c59c828-8557-48cc-a79a-02ea3c9d2d65")>, <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="27257d43-81ec-48e4-9ed2-55709a23d60f", element="e2058a00-9bad-4f0c-8e2d-a236a567dddd")>]

Этот вывод появляется, если я поставлю time.sleep(0) до time.sleep(4).

В любом случае, это не тот вывод, который я хочу; Я хочу видеть все якоря на своей странице.

Что я делаю не так?

Извините, я новичок в этом.

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Может быть проблема с динамической загрузкой элемента, надеюсь, это поможет вам. Пожалуйста, рассмотрите эту проблему, у нее есть решение для динамических элементов.

Как ждать, пока элемент присутствует в Selenium?

0 голосов
/ 27 июня 2018

Попробуйте следующий код:

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


urls = ui.WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.TAG_NAME, "a")))

for url in urls:

    print(url.get_attribute("href"))

# Another example of printing URLs (where actual_urls is a list of anchors).
actual_urls = [url.get_attribute("href") for url in urls]
print(actual_urls)

Надеюсь, это поможет!

...