Обработка элемента без атрибута клика - PullRequest
0 голосов
/ 19 февраля 2020

Я хочу нажать на этот элемент под названием «Выбрать файл», это кнопка, но я не могу щелкнуть по ней, используя команду селена. Элемент, который я собираюсь щелкнуть, выглядит следующим образом:

<label for="file" class="pb default" style="display: inline-block;margin: 5px 10px;">Select File</label>

скрипт, который я использую для щелчка по этому элементу:

_test_=browser.find_elements_by_class_name("pb default")
_test_.click()

Это дает исключение, подобное этому:

Traceback (most recent call last):
  File "z:\test_selenium_impossible_click.py", line 58, in
<module>
    _test_.click()
AttributeError: 'list' object has no attribute 'click'

Я использую последнюю версию firefox с последней версией веб-драйвера для firefox

ОБНОВЛЕНИЕ: Я отредактировал код так:

_test_=browser.find_element_by_class_name("pb default")
_test_.click()

но теперь он выдает результат, подобный следующему:

  Traceback (most recent call last):
  File "z:\automator-python\test_selenium_impossible_click.py", line 57, in <module>
    _test_=browser.find_element_by_class_name("pb default")
  File "C:\Python\Python38-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 564, in find_element_by_class_name
    return self.find_element(by=By.CLASS_NAME, value=name)
  File "C:\Python\Python38-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 976, in find_element
    return self.execute(Command.FIND_ELEMENT, {
  File "C:\Python\Python38-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Python\Python38-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: .pb default

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

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020

Это сообщение об ошибке ...

AttributeError: 'list' object has no attribute 'click'

... означает, что AttributeError был вызван при попытке вызвать click() в элементе List .


Метод click () может быть вызван только для WebElement , но не для List .

В своих тестах кода вы использовали find_elements_by_class_name() (обратите внимание на элементы s), который возвращает List . Поэтому, когда вы пытаетесь вызвать click() в List , AttributeError повышается. Поэтому прежде всего вам нужно заменить find_elements_by_class_name() на find_element_by_class_name().

Кроме того, вы не можете передать несколько классов в качестве аргументов find_element_by_class_name(), что приведет к неверный селектор: составные имена классов не допускаются ошибка. Для прохождения нескольких классов вы должны использовать или в качестве стратегии локатора , и вы можете использовать любое из следующих решений:

  • Использование css_selector:

    _test_ = browser.find_elements_by_css_selector(".pb.default")
    _test_.click()
    
  • Использование xpath:

    _test_ = browser.find_element_by_xpath("//*[@class='pb default']")
    _test_.click()
    

Однако, согласно рекомендациям, я бы предложил использовать гранулярный локатор, добавив tag_name следующим образом:

  • Используя css_selector:

    _test_ = browser.find_elements_by_css_selector("label.pb.default[for='file']")
    _test_.click()
    
  • Использование xpath:

    _test_ = browser.find_element_by_xpath("//label[@class='pb default' and @for='file']")
    _test_.click()
    

Обновление

В идеале, при вызове click() необходимо вызывать WebDriverWait для element_to_be_clickable(), и вы можете использовать любую из следующих стратегий локатора :

  • Использование css_selector:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "label.pb.default[for='file']"))).click()
    
  • Использование xpath:

    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//label[@class='pb default' and @for='file']"))).click()
    

Ссылка

Соответствующее подробное обсуждение можно найти в:

0 голосов
/ 19 февраля 2020

Проблема не в отсутствующих атрибутах, это в расположении элемента.

find_elements_* возвращает список, а не один элемент, поэтому вы не можете щелкнуть по нему.

by_class_name получив один класс в качестве параметра, вы отправили два.

Чтобы найти элемент по нескольким классам, используйте css_selector

find_element_by_css_selector('.pb.default')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...