繁体   English   中英

"上下滚动以使用 Selenium Python 将元素放入视图"

[英]Scroll up and down to get Element into View with Selenium Python

我需要能够向上滚动,然后向下滚动才能找到 Selenium 的一些元素。
我已经看到了很多问题和答案,我发现的主要思想是self.web_driver.execute_script("return arguments[0].scrollIntoView(true);", element)这就是我目前在我的代码中的内容。 但这还不够好,因为此代码仅向下滚动,因此如果元素位于可滚动视图的上部,则无法找到该元素。
所以我需要一个首先向上滚动(向上滚动?)然后开始向下滚动的脚本。
我尝试过这样的事情

self.web_driver.execute_script("return arguments[0].scrollIntoView(true);", element) 
self.web_driver.execute_script("window.scrollTo(0, -document.body.scrollHeight);")
self.web_driver.execute_script("return arguments[0].scrollIntoView(true);", element)

但这不会向上滚动:(

您可以尝试以下代码向上滚动页面:

from selenium.webdriver.common.keys import Keys

self.web_driver.find_element_by_tag_name('body').send_keys(Keys.HOME)

另一种方式(首选)您可以向上滚动到所需元素:

element = self.web_driver.find_element_by_xpath('SOME_XPATH') # you can use ANY way to locate element
coordinates = element.location_once_scrolled_into_view # returns dict of X, Y coordinates
self.web_driver.execute_script('window.scrollTo({}, {});'.format(coordinates['x'], coordinates['y']))

多年来,我发现了一个handy tricky hacky stuff (我已经使用 Selenium 150 年了)。

每当您无法向上滚动表单时,只需将键发送到页面顶部的输入中即可 驱动程序会找到它并自动向上滚动页面以执行操作。

每当我想到这个技巧时,我就意识到成为一个老人并没有那么糟糕。

祝你新来的水手好运,在塞勒尼亚的海岸上见。

试试这个,效果很好:

view_port_height = "var viewPortHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);"
element_top = "var elementTop = arguments[0].getBoundingClientRect().top;"
js_function = "window.scrollBy(0, elementTop-(viewPortHeight/2));"

scroll_into_middle = view_port_height + element_top + js_function

driver.execute_script(scroll_into_middle, element)

您也可以使用getBoundingClientRect()scrollTo()

self.web_driver.execute_script("coordinates = arguments[0].getBoundingClientRect();scrollTo(coordinates.x,coordinates.y);", element)

我测试过,它会上升和下降。

如果您将驱动程序定义为webdriver.Chrome()webdriver.Firefox() ,则可以使用此代码向上滚动:

from selenium.webdriver.common.keys import Keys
driver.find_element_by_tag_name('body').send_keys(Keys.HOME)

另外,要向下滚动,您可以尝试以下代码:

driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", scr1)

scr1是您要滚动它的框 xpath。 您也可以通过此代码滚动到页面中间:

driver.execute_script("arguments[0].scrollTop = arguments[0].scrollWidth", scr1)

这对我非常有用:

WebElement scrolling = new WebDriverWait(driver, 10)
            .until(ExpectedConditions.visibilityOfElementLocated(By.className("classSomething")));

//SCroll Down
((JavascriptExecutor) driver).executeScript("arguments[0].scrollTo(0, arguments[0].scrollHeight)", scrolling);

//Scroll Up
((JavascriptExecutor) driver).executeScript("arguments[0].scrollTo(0, arguments[0].scrollUp)", scrolling);

对于 java,我使用下一个表达式:

  WebElement element = drv.findElement(By.xpath("//div"));
  (drv as JavascriptExecutor).executeScript("arguments[0].scrollIntoView();", element);

片段向下滚动到 Selenium 中的一个元素,直到它可见

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM