использование дочерних узлов в качестве квалификаторов в xpath, для selenium webdriver

Я использую selenium webdriver в приложении Django (Python). Мой вопрос – это xpath.

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

<a href="HTTPS://hccadvisor.hccfl.edu:443/WebAdvisor/WebAdvisor?TOKENIDX=4932326730&amp;type=P&amp;pid=UT-LGRQ" onmouseover="window.status=''; return true;"> <span class="label">Log In </span> </a> 

Его нужно захватывать каждый раз, когда маркер крепится посередине.

Моя функция вызывала

 def access_link_by_text(text, driver): block = driver.find_element_by_xpath("//a[text()='{text}']".format(text=text)) link = block.get_attribute('href') driver.get(link) 

но на двух моих других школьных сайтах я вижу, как обтекание текста происходит в пределах:

 login_block = hcc_driver.find_element_by_xpath("//a/span[text()='Log In ']") login_link = login_block.get_attribute('href') 

Если login_link не существует, поскольку login_block не захватывает <a href... который я хочу. Он захватывает span , так как я сказал «any a's with span children, текст которого« Вход ». Я хочу взять a используя детскую прослойку, в качестве теста, поэтому я попробовал:

 login_block = hcc_driver.find_element_by_xpath("//a/child::span[text()='Log In ']") 

который также потерпел неудачу.

Как вы используете детей / родителей / сестер в качестве квалификационных тестов, не пытаясь их выбрать, чтобы я мог получить эту ссылку?

спасибо

Если login_link не существует, поскольку login_block не захватывает <a href... который я хочу. Он захватывает промежуток, так как я сказал «any a's with span children, текст которого« Вход ». Я хочу взять a, используя детскую прослойку, в качестве теста, поэтому я попробовал:

Вы близки. Вы можете вложить предикаты. Решение должно быть:

 //a[child::span[text()='Log In ']] 

Который выберет каждый <a> в документе, который имеет диапазон, который имеет текстовый узел с текстом "Log In " . Вы можете быть осторожны в отношении возможных добавленных пробелов, это немного безопаснее:

 //a[child::span[normalize-space(text())='Log In']] 

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

 span[normalize-space(text())='Log In']/parent::a