#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
имени класса.
Это может быть вызвано несколькими проблемами:
- Вы используете неправильный локатор, на этой странице нет элемента с
error-code
атрибутом имени класса. - Вам не хватает ожидания / задержки. Возможно, вы пытаетесь получить доступ к этому элементу до загрузки страницы.
- Возможно, там есть 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. Смотрите обновленный ответ