Как проверить, существует ли элемент, используя if - elif - else - PullRequest
2 голосов
/ 24 февраля 2020

У меня есть выпадающее меню, и мне нужно проверить его записи. Если записи нет, я могу добавить новые записи, если есть только одна запись, я удаляю ее и добавляю новые записи, а когда у меня много записей (> = 2), я не могу приступить к добавлению записей. Я могу проверить это через person_rem_btn. Если у меня есть только одна кнопка doc_person_table:0:person_rem_btn, я могу продолжить Если у меня есть вторая кнопка doc_person_table:1:person_rem_btn, я не могу продолжить.

Я получаю это исключение:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id='frmMain:doc_person_table:1:person_rem_btn']/span[1]"}

Однако в этом суть этот элемент может быть недоступен, я просто проверяю его существование. Буду признателен за любую помощь. Вот мой код:

if driver.find_element_by_xpath("//*[@id='frmMain:doc_person_table:1:person_rem_btn']/span[1]") == True:
   print ("there are already many entries")
   driver.close()
elif (driver.find_element_by_xpath("//*[@id='frmMain:doc_person_table:1:person_rem_btn']/span[1]") == False and driver.find_element_by_xpath("//*[@id='frmMain:doc_person_table:0:person_rem_btn']/span[1]") == True):
   print ("there is only one entry, it will be removed to proceed")
   WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//*[@id='frmMain:doc_person_table:0:person_rem_btn']/ span[1]"))).click()
else:
    print ("there is no entry, you can proceed")

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

find_element_by_xpath не возвращает True или False, возвращает WebElement или выбрасывает NoSuchElementException. Вы можете использовать find_elements_by_xpath, чтобы получить список и проверить, содержит ли этот список какие-либо элементы. Начните с ожидания несвязанного элемента, который может указывать на загрузку страницы

WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//*[@id^='frmMain:doc_person_table")))
# assuming this element will always appear when the page is loaded

elements = driver.find_elements_by_xpath("//*[@id='frmMain:doc_person_table:1:person_rem_btn']/span[1]")
if elements: # more verbose if len(elements) > 0
    print ("there are already many entries")
    driver.close()
else:
    elements = driver.find_elements_by_xpath("//*[@id='frmMain:doc_person_table:0:person_rem_btn']/span[1]")
    if elements:
        print ("there is only one entry, it will be removed to proceed")
        elements[0].click()
    else:
        print ("there is no entry, you can proceed")
0 голосов
/ 24 февраля 2020

Существует несколько подходов, которые вы можете адаптировать, и один из них заключается в создании списка из раскрывающихся записей, вызывающих WebDriverWait для visibility_of_all_elements_located(), и проверки размера списка:

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

    list = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "[id*='doc_person_table'][id$='person_rem_btn']>span")))
    if not list:
        print ("there is no entry, you can proceed")
        # other steps
    elif len(list) == 1
        print ("there is only one entry, it will be removed to proceed")
        # other steps
    else:
        print ("there are already many entries")
        break
    
  • Использование XPATH:

    list = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//*[contains(@id, 'doc_person_table') and contains(@id, 'person_rem_btn')]/span")))
    if not list:
        print ("there is no entry, you can proceed")
        # other steps
    elif len(list) == 1
        print ("there is only one entry, it will be removed to proceed")
        # other steps
    else:
        print ("there are already many entries")
        break
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...