как определить css selector :: before в селене не работает - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь использовать Selenium, чтобы получить все элементы в списке :: before псевдоэлементом. Я не могу сохранить данные в списке.

Сценарий: Я хочу добавить все данные в список, где данные в li и теге

Вот как выглядит DOM:

enter image description here

Я использую селен + python

Этот код находится в главной категории nav 'Women':

element_to_select = driver.find_element_by_xpath("//*[@id='nico-main-header']/nav/ul/li[1]")
hover = ActionChains(driver).move_to_element(element_to_select)
hover.perform()
driver.implicitly_wait(15)

Распечатать все теги li achor:

ele = driver.find_element_by_css_selector("ul .row .col-md-3:first-child ul li")

print(ele)

**, но тег привязки li не появляется при печати элемента.

Ответы [ 3 ]

0 голосов
/ 12 марта 2020

Отказ от ответственности: это не оптимальное решение. Я впервые использую python и не очень разбираюсь с селеном.

elem = driver.find_element_by_css_selector('.col-md-3').find_elements_by_tag_name('a')

  for a_tag_data in elem:
    a_tag_data_text = a_tag_data.text
    my_a_tag_datas = my_a_tag_datas + a_tag_data_text

print(my_a_tag_datas)
0 голосов
/ 13 марта 2020

Псевдоэлементы

A CSS псевдоэлемент используется для стилизации указанных частей элемента. Он может использоваться для:

  • Стили первой буквы или строки элемента
  • Вставка содержимого до или после содержимого элемента

:: before

::before вставляет содержимое перед любым другим содержимым в HTML вместо after. Единственными причинами использования одного над другим являются:

  • Вы хотите, чтобы сгенерированный контент располагался перед содержимым элемента, позиционно.
  • Содержимое ::after также "после" в исходном порядке, поэтому он будет располагаться поверх ::before, если естественным образом накладываются друг на друга.

Этот сценарий использования

Для извлечения всех текстов в <a> тег, используя Selenium и Python, вы должны вызвать WebDriverWait для visibility_of_all_elements_located(), и вы можете использовать любой из следующих Locator Стратегии :

  • Использование CSS_SELECTOR:

    driver.get("https://nthqibord.com/2019/08/15/pemimpin-pkr-pertahan-tun-mahathir/")
    print([my_elem.text for my_elem in WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "a#main-category-menu[href='/shop/women/'] + ul.top-nav-border ul li>a")))])
    
  • Использование XPATH:

    driver.get("https://nthqibord.com/2019/08/15/pemimpin-pkr-pertahan-tun-mahathir/")
    print([my_elem.text for my_elem in WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.XPATH, "//a[@id='main-category-menu' and @href='/shop/women/']//following::ul[@class='top-nav-border']//ul//li/a")))])
    
  • Примечание : необходимо добавить следующий импорт:

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

Вы можете использовать этот код: Для тега

my_a_tag_datas = []      //empty list
a_data = driver.find_elements_by_tag_name("a")   //a tag from web driver
for a_tag_data in a_data:      
    a_tag_data_taxt = a_tag_data.text    // a tag element data convert to text
    my_a_tag_datas.append(a_tag_data_taxt)   //  a tag whole data save in list
print(my_a_tag_datas)    // print list data

Для тега li: тот же код, просто замените «a» на «li»

Примечание. Если вы сохраняете все элементы, а не текст, добавьте a_tag_data, где я добавляю a_tag_data_taxt

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