Python, если elif еще не может перейти к оператору elif Selenium

#python #selenium #class #if-statement #selenium-webdriver

Вопрос:

У меня есть фрагмент кода, который проверяет, есть ли элемент, отображаемый с помощью p, затем он отображает диалоговое окно, но если он не может его найти, он проверяет наличие другого элемента, и если это отображается другое диалоговое окно, и если этот элемент недоступен, то он запускает фрагмент кода.

Код находится здесь.

 if driver.find_element_by_class_name('error-code').is_displayed():  LoginError.show() elif driver.find_element_by_xpath('//*[@id="sample-data-table"]/thead').is_displayed():  QuestionUnavailable.show() else:  if driver.find_element_by_xpath('//*[@id="radio1"]').is_displayed():  driver.find_element_by_xpath('//*[@id="radio1"]').click()  driver.find_element_by_xpath('//*[@id="btn-savecheck"]').click()  time.sleep(1)  driver.find_element_by_xpath('//*[@id="btn-alert-ok"]').click()  

Но когда я запускаю его, я получаю эту ошибку

 File "Sciborg.py", line 60, in This  File "C:Python39libsite-packagesseleniumwebdriverremotewebdriver.py", line 564, in find_element_by_class_name  return self.find_element(by=By.CLASS_NAME, value=name)  File "C:Python39libsite-packagesseleniumwebdriverremotewebdriver.py", line 976, in find_element  return self.execute(Command.FIND_ELEMENT, {  File "C:Python39libsite-packagesseleniumwebdriverremotewebdriver.py", line 321, in execute  self.error_handler.check_response(response)  File "C:Python39libsite-packagesseleniumwebdriverremoteerrorhandler.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":"css selector","selector":".error-code"}  

Ответ №1:

Как вы можете ясно видеть из ошибки, вашему коду не удается найти элемент, расположенный по error-code имени класса.
Это может быть вызвано несколькими проблемами:

  1. Вы используете неправильный локатор, на этой странице нет элемента с error-code атрибутом имени класса.
  2. Вам не хватает ожидания / задержки. Возможно, вы пытаетесь получить доступ к этому элементу до загрузки страницы.
  3. Возможно, там есть iframe, поэтому этот элемент находится внутри этого iframe, поэтому вам нужно переключиться на этот iframe, чтобы получить доступ к нужному элементу.
    UPD
    В случае, если на странице нет такого элемента, вы можете использовать find_elements вместо find_element метода, как показано ниже:
 if driver.find_elements_by_class_name('error-code'):  LoginError.show() elif driver.find_elements_by_xpath('//*[@id="sample-data-table"]/thead'):  QuestionUnavailable.show() else:  if driver.find_elements_by_xpath('//*[@id="radio1"]'):  driver.find_element_by_xpath('//*[@id="radio1"]').click()  driver.find_element_by_xpath('//*[@id="btn-savecheck"]').click()  time.sleep(1)  driver.find_element_by_xpath('//*[@id="btn-alert-ok"]').click()  

driver.find_elements_by_class_name('error-code') вернет список веб — элементов. Если элемент существует, это вернет непустой список, который интерпретируется как логическое true значение . В противном случае он вернет пустой список, который интерпретируется как логическое false значение .
Аналогичным образом я обновил другие if случаи.
Но вы все равно должны убедиться, что элементы, к которым вы пытаетесь получить прямой доступ, существуют.
Я имею в виду эти элементы:

 driver.find_element_by_xpath('//*[@id="radio1"]').click() driver.find_element_by_xpath('//*[@id="btn-savecheck"]').click() time.sleep(1) driver.find_element_by_xpath('//*[@id="btn-alert-ok"]').click()  

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

1. Но не следует ли сразу перейти к заявлению elif

2. Нет, поскольку он создает исключение, нарушающее поток программы, он не возвращает логическое false значение.

3. ооо, хорошо, спасибо. Есть ли способ, как я могу заставить это работать?

4. Конечно, их несколько. Я обновлю ответ

5. Смотрите обновленный ответ