AttributeError: у объекта 'list' нет атрибута 'click' с использованием Selenium и Python [duplicate]

4

Я бы хотел нажать кнопку "Годовой" на странице, которая по умолчанию установлена в "Quarterly". Есть две ссылки, которые в основном называются одинаковыми, за исключением того, что у вас есть data-ptype="Annual" поэтому я попытался скопировать xpath, чтобы нажать кнопку (также попробовал другие варианты, но никто не работал).

Тем не менее, я получаю AttributeError: 'list' object has no attribute 'click'. Я прочитал много подобных сообщений, но не смог исправить свою проблему. Поэтому я предполагаю, что событие javascript должно быть вызвано/нажато/выполнено каким-то образом отличным. Idk Im застрял

from selenium import webdriver
link = 'https://www.investing.com/equities/apple-computer-inc-balance-sheet'

driver = webdriver.Firefox()
driver.get(link)
elm = driver.find_elements_by_xpath("/html/body/div[5]/section/div[8]/div[1]/a[1]").click()

Html:

<a class="newBtn toggleButton LightGray" href="javascript:void(0);" data-type="rf-type-button" data-ptype="Annual" data-pid="6408" data-rtype="BAL">..</a>
Теги:
selenium
selenium-webdriver
webdriver

4 ответа

1
Лучший ответ

Я все же предлагаю вам пойти с linkText через XPATH. Причина в том, что этот xpath: /html/body/div[5]/section/div[8]/div[1]/a[1] является абсолютно абсолютным и может быть неудачным, если есть еще один div, добавленный или удаленный из HTML. В то время как шансы на изменение ссылки Text очень минимальны.

Итак, вместо этого кода:

elm = driver.find_elements_by_xpath("/html/body/div[5]/section/div[8]/div[1]/a[1]").click()

попробуйте этот код:

annual_link = driver.find_element_by_link_text('Annual')
annual_link.click()

и да @Druta прав, используйте find_element для одного веб-элемента и find_elements для списка веб-элемента. и всегда хорошо иметь explicit wait.

Создать экземпляр явного ожидания следующим образом:

wait = WebDriverWait(driver,20)

и используйте ссылку wait следующим образом:

wait.until(EC.elementToBeClickable(By.LINK_TEXT, 'Annual'))  

ОБНОВИТЬ:

from selenium import webdriver
link = 'https://www.investing.com/equities/apple-computer-inc-balance-sheet'

driver = webdriver.Firefox()
driver.maximize_window()
wait = WebDriverWait(driver,40)
driver.get(link)  

driver.execute_script("window.scrollTo(0, 200)") 

wait.until(EC.element_to_be_clickable((By.LINK_TEXT, 'Annual')))
annual_link = driver.find_element_by_link_text('Annual')
annual_link.click()
print(annual_link.text)  

обязательно импортируйте их:

from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC 
  • 0
    @ Феликс: я обновил свой ответ в разделе обновления. Этот код отлично работает на моей машине. Вам нужно будет прокрутить вниз, чтобы взаимодействовать с кнопкой Годовой. Спасибо !
4

вам нужно использовать find_element_by_xpath не find_elements_by_xpath который возвращает list

driver.find_element_by_xpath("/html/body/div[5]/section/div[8]/div[1]/a[1]").click()

Также я думаю, что лучше использовать Waits, например.

from selenium.webdriver.common.by import By    
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.firefox.options import Options

options = Options()
options.add_argument("--window-size=1920,1080")
driver = webdriver.Firefox(firefox_options=options)

path = "/html/body/div[5]/section/div[8]/div[1]/a[1]"
try:
    element = WebDriverWait(driver, 5).until(
                           EC.element_to_be_clickable((By.XPATH, path)))
    element.click()
finally:
    driver.quit()
  • 0
    Спасибо, но я все еще получаю сообщение об ошибке, потому что всплывающее окно появляется .. Есть ли способ обойти это? Причина, по которой я получаю: ElementClickInterceptedException: 'Элемент <a class="newBtn toggleButton LightGray" href="javascript:void(0);"> не активируется в данный момент (175.29999542236328,530.3166961669922), потому что другой элемент <div class = "acceptBarWra затемняет это
  • 0
    я обновляю свой ответ, пытаюсь добавить options чтобы открыть firefox в полном окне, но я запускаю код без options и он работает
2

Согласно документации find_elements_by_xpath (xpath) возвращает список с элементами, если они были найдены, или пустой список, если нет. В списке Python нет связанного с ним метода click(). Вместо метода find_element_by_xpath (xpath) есть связанный с ним метод click(). Таким образом, вам нужно использовать find_element_by_xpath(xpath) вызывающий официанта через нерабочее соединение WebDriverWait с ожидаемыми условиями, установленными как element_to_be_clickable (локатор) следующим образом:

WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@class='newBtn toggleButton LightGray' and @data-type='rf-type-button']"))).click()

Примечание. Необходимо добавить следующие импорты:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
1

Обратите внимание, что find_elements_by_xpath является множественным, он возвращает список элементов. Не один. Список может содержать не один или несколько элементов.

Вы можете, например, нажать на первый матч с помощью:

driver.find_elements_by_xpath("/html/body/div[5]/section/div[8]/div[1]/a[1]")[0].click()

или перебирать список и нажимать на все эти элементы, или вы можете использовать find_element_by_xpath (который возвращает один элемент, если он может быть найден):

driver.find_element_by_xpath("/html/body/div[5]/section/div[8]/div[1]/a[1]").click()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню