Я бы хотел нажать кнопку "Годовой" на странице, которая по умолчанию установлена в "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>
Я все же предлагаю вам пойти с 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
вам нужно использовать 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()
options
чтобы открыть firefox
в полном окне, но я запускаю код без options
и он работает
Согласно документации 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
Обратите внимание, что 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()