有时我们会遇到一种情况是,当我们找一个视频列表中的视频,在页面的最底层,此时selenium 无法定位到这个元素,因为 selenium只能定位页面上显示出来内容的元素,需要通过下拉框把界面拉到该元素所在的位置,再进行定位。
比如我们点击成员,想要在当前界面找成员名为“changcheng1211”的成员,最上面找不到,当往下拉滚动条到这个位置时,才可以定位这个元素。
下面是解决方案,先写一个循环,每次按一下向下的箭头,让界面往下移动,同时定位一下。等定位到就可以退出这个循环。
# 1、点击页面左侧“成员”
login.find_element(By.LINK_TEXT, '成员').click()
# 2、点击任意成员头像进入成员主页
# 3、点击“关于”进行浏览
# Keys这个类中提供了键盘上不能直接输入的按键,比如回车键,F1,ESC...,TAB...
# 按住ctrl键,鼠标点击类名,可以查看源码。ARROW_DOWN 是往下。
time.sleep(1)
ac = ActionChains(login)
login.implicitly_wait(1)
for i in range(1000):
ac.send_keys(Keys.ARROW_DOWN).perform()
login.find_element(By.CSS_SELECTOR, '[title="changcheng1211"]').click()
此时会报错:selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: [title="changcheng1211"]
此时可以把这个错误作为一个异常进行处理,
# 1、点击页面左侧“成员”
login.find_element(By.LINK_TEXT, '成员').click()
# 2、点击任意成员头像进入成员主页
# 3、点击“关于”进行浏览
# Keys这个类中提供了键盘上不能直接输入的按键,比如回车键,F1,ESC...,TAB...
# 按住ctrl键,鼠标点击类名,可以查看源码。ARROW_DOWN 是往下。
time.sleep(1)
ac = ActionChains(login)
login.implicitly_wait(1)
for i in range(1000):
ac.send_keys(Keys.ARROW_DOWN).perform()
try:
login.find_element(By.CSS_SELECTOR, '[title="changcheng1211"]').click()
break
except NoSuchElementException:
continue
其中,要加入一个隐式等待1秒,增加稳定性。
login.implicitly_wait(1)
滚动条往下循环按一下,
ac.send_keys(Keys.ARROW_DOWN).perform()
增加捕获异常,如果找到这个元素就点击并退出
try:
login.find_element(By.CSS_SELECTOR, '[title="changcheng1211"]').click() break
如果找不到这个元素就会捕获到NoSuchElementException异常,并继续循环。
except NoSuchElementException: continue