Поэкспериментировав с этим, я, кажется, понял, откуда возникла проблема. Ошибка
selenium.common.exceptions.NoSuchElementException: Сообщение: нет такого элемента: невозможно найти элемент: {"method": "xpath", "selector": "// button [@class = "pv-profile-section__card-action-bar pv-skill-section__additional-skill artdeco-container-card-action-bar artdeco-button artdeco-button - третичная artdeco-button - 3 artdeco-button - жидкость"] "} (Информация о сеансе: chrome = 81.0.4044.113)
всегда правильно указывает проблему, с которой она столкнулась, и поэтому не может найти элемент. Возможные причины этого включают:
- Элемент, отсутствующий на момент выполнения
- Динамически генерируемый
- контент Конфликтующие имена
В твоем случае это был второй пункт. Поскольку отображаемый контент загружается динамически при прокрутке вниз. Поэтому, когда он впервые загружает ваш профиль, разделы навыков на самом деле отсутствуют в DOM. Поэтому, чтобы решить эту проблему, вам просто нужно прокрутить раздел, чтобы он применялся в DOM.
Эта строка - хитрость. Он будет располагаться на правильной панели и, таким образом, загружать и применять данные к DOM.
driver.execute_script("window.scrollTo(0, 1800)")
Вот мой код (пожалуйста, измените его при необходимости)
from time import sleep
# import parameters
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
ChromeOptions = webdriver.ChromeOptions()
driver = webdriver.Chrome('../chromedriver.exe')
driver.get('https://www.linkedin.com/login?fromSignIn=true&trk=guest_homepage-basic_nav-header-signin')
sleep(0.5)
username = driver.find_element_by_name('session_key')
username.send_keys('')
sleep(0.5)
password = driver.find_element_by_name('session_password')
password.send_keys('')
sleep(0.5)
sign_in_button = driver.find_element_by_xpath('//button[@class="btn__primary--large from__button--floating"]')
sign_in_button.click()
driver.get('https://www.linkedin.com/in/kate-yun-yi-wang-054977127/?originalSubdomain=hk')
sleep(3)
# driver.execute_script("window.scrollTo(0, 1800)")
sleep(3)
loadmore_skills=driver.find_element_by_xpath('//button[@class="pv-profile-section__card-action-bar pv-skills-section__additional-skills artdeco-container-card-action-bar artdeco-button artdeco-button--tertiary artdeco-button--3 artdeco-button--fluid"]')
actions = ActionChains(driver)
actions.move_to_element(loadmore_skills).perform()
#actions.move_to_element_with_offset(loadmore_skills, 0, 0).perform()
loadmore_skills.click()
Вывод
![enter image description here](https://i.stack.imgur.com/a2fn4.png)
Обновление
В связи с вашей новой проблемой вам необходимо реализовать метод непрерывной прокрутки, который бы позволял вам динамически обновить раздел skills
. Это требует больших изменений и в идеале должно быть задано как еще один вопрос.
Я также нашел простое решение, установив прокрутку на правильный порог. Для y=3200
, кажется, отлично работает для всех профилей, которые я проверял, включая ваш, мой и некоторые другие.
driver.execute_script("window.scrollTo(0, 3200)")