Как получить текст в span с xpath. селен питон - PullRequest
1 голос
/ 23 марта 2019

Прежде чем спрашивать, я нахожу ответ через гугл на 2 часа. Но для меня нет ответа.

Я использую селен с питоном

Я применяю ниже q / a ответ на мой код, но текст не печатается.

XPath-запрос для получения n-го экземпляра элемента

Я хочу получить «Не могу выбрать»

<li data-index="5" date="20190328" class="day dimmed">
    <a href="#" onclick="return false;">
        <span class="dayweek">Tuesday</span>
        <span class="day">28</span>
        <span class="sreader">Can't select</span>
    </a>
</li>

Я использую xpath, потому что мне нужно повторить

Я должен сделать это. Приведенный выше HTML-код является простым изменением

day_lists = driver.find_elements_by_xpath('//li')

Ничего не напечатано и ошибки нет

for day_list in day_lists:
    print(day_list.find_element_by_xpath('//span[@class="sreader"]').text)

++++ 2019/3/24/16: 45 (+09: 00)

Когда я тестирую с кодом ниже

print(day_list.find_element_by_xpath('.//span[@class="sreader"]/text()'))

Ошибка выходит. Почему такого элемента нет?

selenium.common.exceptions.NoSuchElementException: 
Message: no such element: Unable to locate element: 
{"method":"xpath","selector":".//span[@class="sreader"]/text()"}

Ответы [ 4 ]

0 голосов
/ 24 марта 2019

Попробуйте следующие варианты:

day_lists=WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, '//li[@class="day dimmed"]')))
for day_list in day_lists:
    print(day_list.find_element_by_xpath('//span[@class="sreader"]').text)

OR

day_lists=WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, '//li[@class="day dimmed"]')))
for day_list in day_lists:
   print(driver.execute_script("return arguments[0].innerHTML;", day_list.find_element_by_xpath('//span[@class="sreader"]')))

Обратите внимание, что вам также необходимо следующее импортирование.

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

Вот решения.Если это не сработает, я предполагаю, что элемент может присутствовать либо в отдельном окне, либо во фрейме.

CSS: li [class = 'day dimmed'] [date = '20190328'].sreader enter image description here

xpath:

enter image description here

Чтобы проверить, есть линесколько окон используйте ниже

print(len(driver.window_handles))

Чтобы проверить, есть ли несколько кадров, используйте ниже

print(len(driver.find_elements_by_css_selector('iframe')))
0 голосов
/ 23 марта 2019

Если ничего не напечатано и ошибки нет , то требуемый текст может быть скрыт или еще не сгенерирован.

Для первого случая вам может понадобиться get_attribute('textContent'):

day_lists = driver.find_elements_by_tag_name('li')
for day_list in day_lists:
    print(day_list.find_element_by_xpath('.//span[@class="sreader"]').get_attribute('textContent'))

Для второго случая:

from selenium.webdriver.support.ui import WebDriverWait as wait

day_lists = driver.find_elements_by_tag_name('li')
for day_list in day_lists:
    print(wait(driver, 10).until(lambda driver: day_list.find_element_by_xpath('.//span[@class="sreader"]').text)

Обратите внимание, что в обоих случаях вам нужно добавить начальную точку в XPath:

'//span' --> './/span'
0 голосов
/ 23 марта 2019

Чтобы напечатать нужный текст, например, 선택 불가 из тега <span>, вы можете написать функцию следующим образом:

def print_text(my_date):
        print(driver.find_element_by_xpath("//li[@class='day dimmed'][@date='" +my_date+ "']//span[@class='sreader']").get_attribute("innerHTML"))

Теперь вы можете вызывать функцию с любой датой какследует:

print_text("20190328")
...