Селен - элементы не скрыты - PullRequest
0 голосов
/ 26 декабря 2018

Поскольку я пробовал селен через Python, я не могу извлечь заголовки со страницы финансов Yahoo.

Ниже приведен код, с которым я работаю:

from selenium import webdriver

driver = webdriver.Chrome()
driver.maximize_window()
driver.get('http://www.finance.yahoo.com')

driver.find_element_by_xpath("//a[@title='Industries']").click()

element_list = driver.find_elements_by_xpath("//ul[@data-test='secnav-list']//child::a")

#element_list remains empty - not sure why
for i in element_list:
    print(i.get_attribute('title'))

Я надеялся получить 9 названий (финансы, здравоохранение, услуги, коммунальные услуги, промышленные товары, основные материалы, конгломераты, потребительские товары).Товары, технологии).Однако список элементов показывает пустой список и, следовательно, цикл for не выполняется.

Я попробовал xpath в chrome inspect.Я также попробовал другие инструменты xpath-practice онлайн, и, похоже, все элементы верны правильно.Не уверен, почему это не работает в программе.

Еще одна вещь, которую я попытался, - задать условие фильтра в xpath, например

driver.find_elements_by_xpath("//ul[@data-test='secnav-list']//child::a[@title='Healthcare']")

. Это корректно возвращает элемент в программе.

Может ли кто-нибудь помочь мне понять, что мне здесь не хватает?Ценю вашу помощь.

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Чтобы извлечь заголовки со страницы финансов Yahoo, вам не нужно click(), а простая Мышь Hover выполняет работу, вызывающую WebDriverWait несоответствие с Ожидаемые_условия следует:

  • Кодовый блок:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait 
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.action_chains import ActionChains
    
    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    options.add_argument('disable-infobars')
    driver = webdriver.Chrome(executable_path=r'C:\WebDrivers\chromedriver.exe', chrome_options=options)
    driver.get("http://www.finance.yahoo.com")
    ActionChains(driver).move_to_element(WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.LINK_TEXT, "Industries")))).perform()
    sub_menus = WebDriverWait(driver, 30).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "div>ul li>a[href*='/sector/']")))
    for sub_menu in sub_menus:
        print(sub_menu.text)
    
  • Консольный вывод:

    Financial
    Healthcare
    Services
    Utilities
    Industrial Goods
    Basic Materials
    Conglomerates
    Consumer Goods
    Technology
    
0 голосов
/ 26 декабря 2018

Вам просто нужно w ait, чтобы меню явно отображалось с WebDriverWait:

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


driver = webdriver.Chrome()
driver.maximize_window()
driver.get('http://www.finance.yahoo.com')

driver.find_element_by_xpath("//a[@title='Industries']").click()

# wait for menu to show up
wait = WebDriverWait(driver, 10)
company_menu = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "[data-test=secnav-list]")))

titles = company_menu.find_elements_by_css_selector("li > a")
for title in titles:
    print(title.get_attribute('title'))

Печать:

Financial
Healthcare
Services
Utilities
Industrial Goods
Basic Materials
Conglomerates
Consumer Goods
Technology
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...