Python 动态生成的元素-NoTouchElementException:消息:没有这样的元素:无法定位元素?

Python 动态生成的元素-NoTouchElementException:消息:没有这样的元素:无法定位元素?,python,selenium,Python,Selenium,在Linkedin页面上选择“加载更多”按钮时遇到问题。我在查找xpath时收到此错误:selenium.common.exceptions.NoSuchElementException:Message:没有这样的元素:无法定位元素 我怀疑问题在于该按钮当时在页面上不可见。所以我尝试了操作。将\u移动到\u元素。但是,页面会在元素的正下方滚动,因此元素不再可见,随后会发生相同的错误 我也尝试过用偏移量将元素移动到元素,但这并没有改变页面滚动到的位置 如何滚动到页面上的正确位置,以便成功选择元素

在Linkedin页面上选择“加载更多”按钮时遇到问题。我在查找xpath时收到此错误:
selenium.common.exceptions.NoSuchElementException:Message:没有这样的元素:无法定位元素

我怀疑问题在于该按钮当时在页面上不可见。所以我尝试了
操作。将\u移动到\u元素
。但是,页面会在元素的正下方滚动,因此元素不再可见,随后会发生相同的错误

我也尝试过用偏移量将元素移动到元素,但这并没有改变页面滚动到的位置

如何滚动到页面上的正确位置,以便成功选择元素

我的相关代码:

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

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

如果加载时按钮在页面上不可见,则使用
直到
方法延迟执行

try:
    myElem = WebDriverWait(browser, delay).until(EC.presence_of_element_located((By.ID, 'IdOfMyElement')))
    print "Button is rdy!"
except TimeoutException:
    print "Loading took too much time!"
例子取自

要获得元素的确切位置,可以使用以下方法

element = driver.find_element_by_id('some_id')
element.location_once_scrolled_into_view

这实际上是为了返回页面上元素的坐标(
x
y
),但也可以向右滚动到目标元素。然后可以使用坐标单击按钮。你可以阅读更多相关内容。

在仔细研究之后,我似乎已经找到了问题的根源。错误

selenium.common.exceptions.NoSuchElementException:Message:没有这样的元素:找不到元素:{“方法”:“xpath”,“选择器”:“//button[@class=“pv-profile-section\uu card-action-bar pv-skills-section\uu附加技能artdeco容器卡动作栏artdeco按钮artdeco按钮--第三级artdeco按钮--第三级artdeco按钮--流体”} (会话信息:chrome=81.0.4044.113)

始终正确说明遇到的问题,因此无法找到元素。可能的原因包括:

  • 元素在执行时不存在
  • 动态生成
  • 内容冲突名称
就你而言,这是第二点。当您向下滚动时,显示的内容将动态加载。因此,当它第一次加载您的概要文件时,技能部分实际上并不存在于DOM中。所以要解决这个问题,您只需滚动到该部分,以便在DOM中应用它

这条线就是这里的诀窍。它将把它定位到正确的面板上,从而将数据加载并应用到DOM中

driver.execute_script("window.scrollTo(0, 1800)")
这是我的代码(请根据需要更改)

输出

更新

考虑到较新的问题,您需要实现一个连续滚动方法,使您能够动态更新
技能
部分。这需要很大的改变,最好是作为另一个问题来问

我还找到了一个简单的解决方案,将滚动设置为正确的阈值。对于
y=3200
,对于我检查过的所有配置文件,包括您的、我的和少数其他配置文件,似乎都可以正常工作

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

当我们在selenium程序代码中提到的定位器(即id/xpath/name/class_name/css选择器等)无法在网页上找到web元素时,您将获得NoTouchElementException错误

如何解决无接触异常:

  • Apply WebDriverWait:允许webdriver等待特定时间
  • 试挡
  • 所以,在对webelement执行操作之前,您需要查看web元素,我已经删除了未加载的代码,并且避免使用硬编码等待,因为这不是处理同步问题的好做法。此外,当点击“显示更多”按钮时,您必须向下滚动,否则它将无法工作

    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="path of 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()
    
    driver.execute_script("scroll(0, 250);")
    buttonClick = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, "//span[text()='Show more']")))
    ActionChains(driver).move_to_element(buttonClick).click().perform()
    
    输出:


    谢谢您的回复。我尝试了这两种解决方案,但都没有效果。我收到超时异常打印消息的第一个解决方案。在第二个解决方案中,我收到了相同的错误:
    NoSuchElementException:Message:没有这样的元素
    。我知道我的xpath是正确的,因为我在ipython中逐行使用了它。非常小的错误!!!发生这种情况的原因是,当您将其自动化时,它没有登录,因此通常会显示LinkedIn注册模式或链接配置文件的简短部分。尝试以匿名模式访问您的个人资料url,您将看到上述任何一种情况。因此,它不包含
    技能部分
    ,因此会出现
    未找到元素
    错误。啊,我应该在我的代码中包含这一点,但是的,我已登录!为了简洁起见,我把它删掉了。该元素未被找到,尽管已记录在感谢您的全面回答!如果技能部分位于不同Linkedin配置文件上的不同坐标,那么行
    driver.execute_script(“window.scrollTo(01800)”)
    是否不再工作?我的最终目标是创建一个for循环,在多个页面中运行该循环,因此希望无论Linkedin URL是否正确,滚动都能正常工作。在这种情况下,您可以执行连续滚动,直到找到元素为止。如果此答案有帮助,请随时接受答案:)。如果你真的很难实现连续滚动,那么请问另一个问题并在这里@me。谢谢。有什么进展吗??如果你能告诉我最新情况,那就太好了。顺便说一句,如果你在第一篇文章中给出了你问题的全部背景,而不是逐步建立问题,那就太好了。谢谢你的耐心。这一行工作了
    driver.execute_script(“window.scrollTo(01800)”)
    ,但是
    driver.execute_script(“window.scrollTo(03200)”)
    这一行没有工作,因为它为我滚动到了页面的最底部。我将开始另一个问题,尝试实现一些连续滚动选项,但没有成功
    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="path of 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()
    
    driver.execute_script("scroll(0, 250);")
    buttonClick = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, "//span[text()='Show more']")))
    ActionChains(driver).move_to_element(buttonClick).click().perform()