当前位置: 首页 > 面试题库 >

如何连续向下滚动页面直到找到元素? Pythonselenium

长孙宜
2023-03-14
问题内容

我对Linkedin中技能部分的“加载更多”按钮感到困惑。我
在找到按钮的xpath时收到此错误:
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 页面滚动就在元件的下方,因此该元素不再是可见的,随后发生同样的错误。

我也尝试过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)"). 我还从代码中删除了所有不必要的内容,并使其非常简单明了。

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 以外的其他工具,它们是最慢
的刮刀定位器。



 类似资料:
  • 问题内容: 我有一个聊天小部件,每次向上滚动时,它都会拉出一系列消息。我现在面临的问题是加载消息时滑块固定在顶部。我希望它专注于上一个数组中的最后一个索引元素。我发现可以通过传递索引来创建动态引用,但是我还需要知道使用哪种滚动功能来实现这一点 问题答案: 单击此处,获得有关StackBlits的完整演示 React 16.3 +,Class组件 类组件-Ref回调 不要使用字符串引用。 字符串引用

  • 问题内容: 我处于向下滚动时会创建新内容的情况。新内容具有特定的类名称。 我如何继续向下滚动直到所有元素加载完毕?换句话说,我想达到一个阶段,如果我继续向下滚动,则不会加载任何新内容。 我正在使用代码向下滚动,再加上 这种方法的问题在于,在所有元素加载完之后,代码将继续向下滚动,没有创建新元素,最终我收到超时错误。 编辑:这是代码 问题答案: 试一下: 资料来源:https : //github.

  • 问题内容: 我有一个聊天小部件,每次向上滚动时,它都会拉出一系列消息。我现在面临的问题是,在加载消息时,滑块保持固定在顶部,我希望它专注于上一个数组中的最后一个索引元素。我发现可以通过传递索引来创建动态引用,但是我还需要知道要使用哪种滚动功能才能实现这一点 问题答案: React 16.8 +,功能组件 React 16.3 +,Class组件 类组件-Ref回调 不要使用字符串引用。 字符串引用

  • 在端口20436上启动ChromeDriver(V2.9.248315)线程“main”org.openqa.selenium.noSuchelementException异常:没有这样的元素 (会话信息:chrome=53.0.2785.143)(驱动程序信息:ChromeDriver=2.9.248315,platform=Windows NT 6.1 SP1 x86_64)(警告:服务器没有

  • 问题内容: 好吧,我有些困惑。 我试图考虑来自jQuery背景的角度方式。 问题:如果窗口不滚动,我只想隐藏一个固定的元素。如果有人向下滚动页面,我想隐藏该元素。 我尝试创建一个自定义指令,但由于滚动事件未触发,因此无法使其正常工作。我在想一个像下面这样的简单控制器,但是它甚至没有运行。 控制器: 视图 实时预览 http://www.thewinetradition.com.au/new/#/p

  • 问题内容: 我有这个元素: 然后,我还有其他一些元素,例如其他文本输入,文本区域等。 当用户点击带,页面应该滚动到页面的最后一个元素与一个漂亮的动画。它应该是滚动到底部而不是顶部。 页面的最后一项是带有的按钮: 动画不应太快并且应该流畅。 我正在运行最新的jQuery版本。我更喜欢不安装任何插件,而是使用默认的jQuery功能来实现此目的。 问题答案: 假设您有一个ID为的按钮,请尝试以下示例: