如何使用if-elif-else检查元素是否存在

2024-05-08 01:10:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个下拉菜单,我需要检查它的条目。如果没有条目,我可以添加新条目;如果只有一个条目,我将其删除并添加新条目;当我有多个条目(>;=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")

Tags: toidbydocdrivertable条目element
2条回答

您可以采用几种方法,其中一种方法是为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
    

find_element_by_xpath不返回TrueFalse,它返回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")

相关问题 更多 >