我对Linkedin中技能部分的“加载更多”按钮感到困惑。我 在找到按钮的xpath时收到此错误: selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element
问题是我的元素在页面上不可见,因此我一直试图 找到一种方法来在页面上连续滚动直到按钮可见。 我正在尝试对多个配置文件进行forloop。
我的相关代码:
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"]')
Attempts 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 页面滚动就在元件的下方,因此该元素不再是可见的,随后发生同样的错误。
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']))
This returns the same error message
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"]')))
This returns the same error, as well.
4.
driver.execute_script("arguments[0].scrollIntoView();", loadmore_skills)
不知道该怎么做。非常感谢您的帮助。
Error Traceback:
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:
这是完全有效的代码,可按照您在 注释中所述解决您的问题。
其他人提出的答案实际上是向下滚动到 页面底部,然后给出错误。然后我注意到,如果滚动 到底部淹没,那么只会加载底部,而不会加载 中间的所有部分。(Dipak的回答对我也不起作用。也许这 对您以及我来说都是解决问题的方法:),正如他在聊天中所说的那样)
因为您想要的东西出现在页面之间,而不是在底部。因此,只有 底部始终加载。所以现在我们需要做其他事情。
现在,我们要向下滚动到所需的部分。而 做一个自定义滚动下来,我使用 driver.execute_script("scroll(0,1600)"). 我还从代码中删除了所有不必要的内容,并使其非常简单明了。
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 other than XPATH's, cauz 以外的其他工具,它们是最慢 的刮刀定位器。
--headless
css_selectors
XPATH's