Обработка исключений в Selenium, как перебирать множество локаторов элементов, пока один не заработает

#python #selenium #selenium-webdriver #selenium-chromedriver #try-catch

#python #selenium #selenium-webdriver #selenium-chromedriver #попробуйте-catch

Вопрос:

Идентификатор кнопки, на которую я хочу нажать, динамически меняется. Например, идентификатор будет id = Button7, тогда при следующем запуске моего кода он будет id = Button19. Я заметил, что он перебирает набор идентификаторов, но в произвольном порядке.

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

     try:
        source8 = driver.find_element_by_xpath('//*[@id="xl_dijit-bootstrap_Button_99"]')
        ActionChains(driver).click(source8).perform()
    except Exception as e:
        source8 = driver.find_element_by_xpath('//*[@id="xl_dijit-bootstrap_Button_7"]')
        ActionChains(driver).click(source8).perform()
    except Exception as e:
        source8 = driver.find_element_by_xpath('//*[@id="xl_dijit-bootstrap_Button_27"]')
        ActionChains(driver).click(source8).perform()
  

Комментарии:

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

Ответ №1:

Просто выполните итерацию по xpaths:

 for xpath in ['//xpath1', '//hpath2', '//xpath3']:
  try:
    # do something with xpath
    break
  except:
   print(xpath   " failed!")
  

Ответ №2:

Вы можете использовать оси contains XPath, чтобы сначала определить идентификатор, а затем выполнить необходимые действия.

 elementId = driver.find_element_by_xpath("//input[contains(@id, 'xl_dijit-bootstrap_Button_')]")

elementId.click()
  

Еще, если вы хотите выполнить какое-то другое действие с определенным идентификатором, затем извлеките его атрибут и с помощью этого атрибута (‘idTextAttribute’) вы можете реализовать вариант переключения.

 idTextAttribute = elementId.get_attribute("id")

    def SwitchToId(idTextAttribute):
        switcher = {
            "xl_dijit-bootstrap_Button_99": Do Something, like click Or sendKeys,
            "xl_dijit-bootstrap_Button_7": Do Something, like click Or sendKeys,
            "xl_dijit-bootstrap_Button_27": Do Something, like click Or sendKeys,
        }
        return switcher.get(idTextAttribute, "ID not Found")
  

Примечание: в Python нет switch case, подобного Java, поэтому вы можете попробовать switcher или блок if-elif.