NoSuchElementException в python селене (<span> инцидент </span>) - PullRequest
0 голосов
/ 13 января 2020

Когда я пытаюсь щелкнуть вкладку «Инцидент», как показано на рисунке, появляется сообщение об ошибке. Ниже приведен скрипт.

from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://*****.service-now.com/")
driver.switch_to.frame('gsft_main')
driver.find_element_by_id('user_name').send_keys('*****')
driver.find_element_by_id('user_password').send_keys('*****')
driver.find_element_by_id('sysverb_login').click()
Incident=driver.find_element_by_link_text('Incident')

Это элемент, который я получил при копировании после проверки страницы

<span>Incident</span>

Это xpath

//*[@id="concourse_application_dead1309c611228701e2bda7b4252474"]/a/span

Пробовал оба, но нет успеха Дает мне ошибку ниже.

Traceback (most recent call last):    
  File "Test1.py", line 10, in <module>    
    Incident=driver.find_element_by_link_text('Incident')    
  File "C:\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 428, in find_element_by_link_text
    return self.find_element(by=By.LINK_TEXT, value=link_text)    
  File "C:\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 978, in find_element 'value': value})['value']    
  File "C:\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
self.error_handler.check_response(response)    
  File "C:\Python37\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response    
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"link text","selector":"Incident"}

Ответы [ 2 ]

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

Элемент с текстом Инцидент фактически находится в узле <span>. Хотя он находится в родительском узле <a>, вы не сможете использовать find_element_by_link_text() или find_element_by_partial_link_text() для определения местоположения элемента.


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

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

    incident = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "[id^='concourse_application_dead']>a>span")))
    
  • Использование XPATH A:

    incident = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//span[text()='Incident']")))
    
  • Примечание : Вы должны добавить следующие импорты:

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

Ссылка

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

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

find_element_by_link_text() и find_element_by_partial_link_text() работает только для тегов <a>, ваш элемент - <span>. Вам нужно использовать xpath, чтобы найти его

incident = driver.find_element_by_xpath('//span[contains(., "Incident")]')

Поскольку вы перешли на другую страницу, вам также следует добавить немного ожидания

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

wait = WebDriverWait(driver, 10)
incident = wait.until(ec.visibility_of_element_located((By.XPATH, '//span[contains(., "Incident")]')))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...