Как перейти по динамической ссылке c на веб-сайте drupal 8 с помощью селектора xpath / css при автоматизации с помощью Selenium и Python - PullRequest
1 голос
/ 17 января 2020

Я пытаюсь щелкнуть ссылку редактирования вкладки, и она в виде гиперссылки в неупорядоченном списке.

Вот это HTML:

<li><a href="/node/2658/edit" data-drupal-link-system-path="node/2658/edit">Edit</a></li>

I пытался использовать driver.find_element_by_link_text('Edit'), чтобы найти элемент, однако всегда получаю NoSuchElementException.

. Я также использовал частичный текст fxn со всеми вариантами html и получаю то же самое ошибка.

Существует также следующее html Я обнаружил, что содержит правильную ссылку:

<link rel="edit-form" href="/node/2658/edit" />

Есть ли функция селена, которую я могу использовать для go на этой странице редактирования?

1 Ответ

0 голосов
/ 17 января 2020

В соответствии с HTML, которым вы поделились значение из href и data-drupal-link-system-path атрибуты явно кажутся динамическими c из-за присутствия значения 2658. Таким образом, вам нужно создать динамический локатор c для определения местоположения элемента.

Поскольку требуемый элемент является элементом динамического c, чтобы найти и click() на элементе, вы должны вызвать WebDriverWait для element_to_be_clickable(), и вы можете использовать одну из следующих Стратегий локатора :

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

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "li>a[href$='edit'][data-drupal-link-system-path^='node']"))).click()
    
  • Использование XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//li/a[contains(@href, 'edit') and starts-with(@data-drupal-link-system-path, 'node')][text()='Edit']"))).click()
    
  • Примечание : необходимо добавить следующие операции импорта:

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

Объяснение динам c CSS_SELECTOR

Для рассмотрения только stati c часть атрибутов href и data-drupal-link-system-path вы можете использовать следующие подстановочные знаки в :

  • $ : для указания значения атрибута заканчивается

  • ^ : для указания значения атрибута начинается с

Таким образом, наиболее гранулированный css_selector будет:

li>a[href$='edit'][data-drupal-link-system-path^='node']

Опыт версия динамического c XPATH

Чтобы рассмотреть только часть * c атрибутов href и data-drupal-link-system-path, вы можете использовать следующие функции :

  • contains(): для указания значения атрибута содержит

  • starts-with(): для указания значения атрибута начинается с

Таким образом, наиболее детализированный xpath будет:

//li/a[contains(@href, 'edit') and starts-with(@data-drupal-link-system-path, 'node')][text()='Edit']

Ссылка

Вы можете найти несколько соответствующих обсуждение в:


tl; dr

Подробное обсуждение NoSuchElementException можно найти в:

...