我正在使用selenium来抓取一个动态网站。我的问题是我无法向下滚动到我要找的项目。首先,我列出了我想从中获取信息的项目(python_button1)。我必须点击此列表中的每个项目才能看到一个新窗口,我想在其中抓取它们。然后我做了一个循环来点击这些项目。之后,我关闭了我打开的窗口。不幸的是,我无法向下滚动到每个项目以单击它们。我使用了以下代码,但它向下滚动到最后一项并跳过其他项目。如果你能帮助我,我将非常感激。谢谢!
python_button1 = driver.find_elements_by_class_name('simboloEvento')
for x in python_button1:
x.click()
time.sleep(2)
driver.find_element_by_class_name('cerrarBoton').click()
driver.execute_script("coordinates=arguments[0].
getBoundingClientRect();scrollTo( coordinates.x,coordinates.y);", x)
time.sleep(2)
innerHTML = driver.execute_script("return document.body.innerHTML")
print(innerHTML)
向下滚动列表是一个JavaScript对象。我必须点击每个对象来激活javascript函数(一个新窗口)。我可以通过我的代码激活这些对象,但问题是当这些项目中至少有一个不在当前屏幕中时。这就是为什么我应该向下滚动到那个对象(这里是x),然后才能点击它。但我不知道如何向下滚动到那个对象。我已经使用了我在这篇文章中使用的代码以及这个代码:driver.execute_script(“arguments [0] .scrollIntoView();”,x)但是它们都没有为我工作!
答案 0 :(得分:1)
为此你需要两件事。首先要知道元素的位置,你可以使用python-js这样做:
script = 'return arguments[0].getBoundingClientRect().top + document.documentElement.scrollTop;'
posY = driver.execute_script(script, element).split('.')[0]
上面的组合将返回一个字符串,表示元素相对于文档顶部的相对位置(网站)
然后你可以滚动到你想要的位置
driver.execute_script('window.scrollTo(0, '+ posY +');')
这个会移动元素所在的屏幕,需要等待一些元素,所以我建议这种性质的服务员功能:
def waiter(token):
# token is whatever you spect to be in the element like str("/") in a date field
max_time = 60 #segs
driver.switch_to.default_content()
while token not in driver.find_element_by_xpath('//*[@Class="important"]'):
time.sleep(1)
max_time += -1
if max_time == 0:
raise Exception('Waited too long')
使用js导航制作了一个小模块,因为即使selenium很强大,有时它也不想在某些网站上做这件事。
编辑: 为了完整性,此片段使元素可见:
driver.execute_script(“arguments[0].style.visibility = 'visible';”, element)
这是有效的,因为arguments[0]
代表element
execute_script
参数
答案 1 :(得分:0)
您是否尝试过使用selenium actions类?
builder = ActionChains(driver) builder.move_to_element(x).perform()