t.me/atinfo_chat Telegram группа по автоматизации тестирования

Python-selenium webdriver - Как задать клик по альтернативному методу поиска элемента?

Теги: #<Tag:0x00007f7485c17810> #<Tag:0x00007f7485c17748> #<Tag:0x00007f7485c17680>

Как сделать аналог selenium ide в поиске элемента, например: поиск элемента по xpath, если не найден в течении implicitly_wait(5) - скипнуть и приступить к поиску id, если найден, то вывести “ок” и не приступая к поиску id, приступить к следующему шагу.

Я пытался сделать через if\elif\else, try\execpt. Знаний и примеров что нашел - не хватило справиться.

У меня получилось только пропустить шаг, если элемент не найден и продолжить тестирование, но условие задать не получилось кликнуть по xpath или class_name например.

Код без условия:
try:
logo_xpath = driver.find_element_by_xpath(home)
logo_xpath.click()
print(‘logo xpath - pass’)
except NoSuchElementException:
print(‘xpath - failed’)

Логи и ошибка (если ввожу if else) вот такая …

File “C:\Users\anton\PycharmProjects\tfgku\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py”, line 394, in find_element_by_xpath
return self.find_element(by=By.XPATH, value=xpath)
File “C:\Users\anton\PycharmProjects\tfgku\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py”, line 976, in find_element
return self.execute(Command.FIND_ELEMENT, {
File “C:\Users\anton\PycharmProjects\tfgku\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py”, line 321, in execute
self.error_handler.check_response(response)
File “C:\Users\anton\PycharmProjects\tfgku\venv\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”:“xpath”,“selector”:"//*[@xpath"}
(Session info: chrome=83.0.4103.116)

Версии ОС и софта следующие …
windows 10, chrome 83

    public static bool ElementExist(this By by, IWebDriver driver)
    {
        try
        {
            driver.FindElement(by);

            return true;
        }
        catch
        {
            return false;
        }
    }

    public static void FindByXpathAndId(IWebDriver driver)
    {
        By xpath = By.XPath("Ваш локатор");
        By id = By.Id("айдишник элемента");

        if (!xpath.ElementExist(driver) && !id.ElementExist(driver))
        {
            // Тут можно сделать логгер типа logger.Trace("Не удалось найти элемент сначала по Xpath, а потом по ID")
        }
    }

Большое спасибо за помощь, попытаюсь перевести под обычный webdriver своего проекта и отпишу что вышло.

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

ну так все просто же:

  • пишете первый метод, который возвращает true/false в зависимости от того, нашелся ли элемент по переданному в метод локатору
  • во втором методе вызываете первый и пишете в if/else нужную вам логику. Я написал его так, что если оба поиска элемента будут не успешными, то тогда что-то нужно сделать

что надо именно вам - то и пишите

Прошу прощения, я новичок в языке от слова совсем, буду пробовать. Спасибо еще раз :relaxed:

Оказалось не очень просто для полного меня (новичка), но с Вашей помощью получилось, крайне признателен!

Результат тела “кода”:
def check_exists_by_xpath(home):
try:
driver.find_element_by_xpath(home).click()
except NoSuchElementException:
return False
return True
#print(check_exists_by_xpath(home))
def find_by_me():
if (check_exists_by_xpath(home)) is True:
driver.find_element_by_xpath(home).click()
print(‘xpath - pass’)
else:
driver.find_element_by_class_name(homec).click()
print(‘xpath - fail > class - pass’)
find_by_me()