Как непрерывно прокручивать страницу вниз, пока не будет найден элемент? Python селен - PullRequest
1 голос
/ 21 апреля 2020

Я озадачен кнопкой «загрузить больше» для раздела навыков в Linkedin. Я получаю эту ошибку при поиске xpath для кнопки: selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element

Проблема заключается в том, что мой элемент не отображается на странице, поэтому я пытался найти способ непрерывной прокрутки на странице. пока кнопка не видна. Я пытаюсь сделать forl oop из нескольких профилей.

Мой соответствующий код:

import parameters
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver

ChromeOptions = webdriver.ChromeOptions()
driver = webdriver.Chrome('C:\\Users\\Root\\Downloads\\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(parameters.linkedin_username)
sleep(0.5)

password = driver.find_element_by_name('session_password')
password.send_keys(parameters.linkedin_password)
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')

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"]')

Попытки 1.

actions = ActionChains(driver)
actions.move_to_element(loadmore_skills).perform()
#actions.move_to_element_with_offset(loadmore_skills, 0, 0).perform()
loadmore_skills.click()

С actions.move_to_element страница прокручивается чуть ниже элемента, так что элемент больше не виден, и впоследствии возникает та же ошибка.

Я также пробовал move_to_element_with_offset, но это не изменилось там, где страница прокручивается до.

2.

coordinates = loadmore_skills.location_once_scrolled_into_view 
driver.execute_script('window.scrollTo({}, {});'.format(coordinates['x'], coordinates['y']))

Это возвращает то же сообщение об ошибке

3.

loadmore_skills=WebDriverWait(driver,30).until(EC.element_to_be_clickable((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"]')))

Это возвращает ту же ошибку, а также.

4.

driver.execute_script("arguments[0].scrollIntoView();", loadmore_skills)

Не уверен, как еще это сделать. Мы очень ценим вашу помощь.

ОБНОВЛЕНИЕ: Попытка решения @Dipak перемещает меня в конец страницы, и элемент нельзя щелкнуть: enter image description here

Ошибка трассировки:

Traceback (most recent call last):
  File "C:/Users/Root/PycharmProjects/Quant/skillstest.py", line 60, in <module>
    EC.element_to_be_clickable((By.XPATH, "//span[text()='Show more']")))
  File "C:\Users\Root\PycharmProjects\Quant\venv\lib\site-packages\selenium\webdriver\support\wait.py", line 80, in until
    raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: 

Ответы [ 3 ]

1 голос
/ 21 апреля 2020

Попробуйте следующий код:

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


driver = webdriver.Chrome(executable_path="C:\New folder\chromedriver.exe")

driver.get('https://www.linkedin.com/login?fromSignIn=true&trk=guest_homepage-basic_nav-header-signin')
driver.maximize_window()

WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.NAME, "session_key"))).send_keys("email id")
WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.NAME, "session_password"))).send_keys("password")
WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, "//button[@class='btn__primary--large from__button--floating']"))).click()

driver.get("https://www.linkedin.com/in/kate-yun-yi-wang-054977127/?originalSubdomain=hk")
driver.maximize_window()

buttonClick = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, "//span[text()='Show more']")))
ActionChains(driver).move_to_element(buttonClick).click().perform()

Выход:

enter image description here

1 голос
/ 23 апреля 2020

Вот полностью рабочий код, решающий ваши проблемы, как вы указали в комментариях.

Ответы, предложенные другими, фактически прокручивали страницу вниз и затем также давали ошибки. Затем я заметил, что если вы прокрутите тонущий элемент вниз, то загрузится только нижняя часть, а не все эти разделы между ними. (Ответ Дипака не работает и для меня. Может быть, это проблема разрешения для вас, а также для меня:), как он сказал в чатах)

Потому что то, что вы хотите, присутствует между страницей И не внизу. Так что только нижняя часть загружается всегда. Так что теперь нам нужно сделать что-то еще.

То, что мы хотим сейчас, это прокрутить вниз только до тех разделов, которые вы хотите. И чтобы сделать пользовательскую прокрутку вниз, я использовал driver.execute_script("scroll(0, 1600)"). Я также удалил все эти ненужные вещи из кода и сделал его очень простым и понятным.

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
import time

driver = webdriver.Chrome(executable_path=r"C:\Users\intel\Downloads\Setups\chromedriver")

driver.get('https://www.linkedin.com/login?fromSignIn=true&trk=guest_homepage-basic_nav-header-signin')
driver.maximize_window()

WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.NAME, "session_key"))).send_keys("EMAIL")
WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.NAME, "session_password"))).send_keys("PASSWORD")
WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, "//button[@class='btn__primary--large from__button--floating']"))).click()

driver.get("https://www.linkedin.com/in/kate-yun-yi-wang-054977127/?originalSubdomain=hk")
driver.maximize_window()

driver.execute_script("scroll(0, 1600)")
time.sleep(5)
buttonClick = driver.find_element_by_xpath("/html/body/div[6]/div[4]/div[3]/div/div/div/div/div[2]/main/div[2]/div[6]/div/section/div[2]/button/span[1]").click()

Также используйте браузер --headless, чтобы загружать задачи быстрее. И если возможно, тогда используйте css_selectors, отличный от XPATH's, так как они самые медленные локаторы для очистки.

0 голосов
/ 21 апреля 2020

Попробуйте это

actions.move_to_element(loadmore_skills).build().perform()

Вот соответствующий рабочий Java Код

@Test
public void linkedInTest(){
    driver.findElement(By.name("session_key")).sendKeys(username);
    driver.findElement(By.name("session_password")).sendKeys(password);
    driver.findElement(By.xpath("//button[@class='btn__primary--large from__button--floating']")).click();

    driver.get("https://www.linkedin.com/in/kate-yun-yi-wang-054977127/?originalSubdomain=hk");

    WebElement loadmore_skills = driver.findElement(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']"));
    action.moveToElement(loadmore_skills).click().build().perform();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...