Python 如何单击列表框中需要滚动到的元素?

Python 如何单击列表框中需要滚动到的元素?,python,selenium,selenium-webdriver,Python,Selenium,Selenium Webdriver,谢谢你试着帮我 我正在尝试浏览一个包含类别的列表框 当我单击列表框中的项目时,一切正常,直到类别位于可见列表框下方。在这种情况下,它会向我抛出以下错误: 元素在点(1121.5276)处不可单击。其他因素会 收到点击: 所以我的问题是如何单击需要在列表框中滚动一点的元素,才能单击它。 我的代码的非常简短的版本 listUl1 = browser.find_element_by_id('categoryManuallySelectLevel_1') listCategories = [] # F

谢谢你试着帮我

我正在尝试浏览一个包含类别的列表框

当我单击列表框中的项目时,一切正常,直到类别位于可见列表框下方。在这种情况下,它会向我抛出以下错误:

元素在点(1121.5276)处不可单击。其他因素会 收到点击:

所以我的问题是如何单击需要在列表框中滚动一点的元素,才能单击它。

我的代码的非常简短的版本

listUl1 = browser.find_element_by_id('categoryManuallySelectLevel_1')
listCategories = []

# Fetch the id's
for child in listUl1.find_elements_by_xpath(".//"):
    listCategories.append(child.get_attribute('id'))

# click through the items in the list
for item in listCategories:
    element = WebDriverWait(browser,5,poll_frequency=.2).until(EC.visibility_of((By.ID, item)))
    element.click
可在此处找到该网站的链接:


如果你有任何问题,请不要犹豫。我会立即回复我的电话。谢谢。

您可以使用
箭头向下滚动滚动条

listBox = driver.find_element(By.id('categoryManuallySelectLevel_1'))
counter = 1
for item in listCategories:
    if counter % 4 == 0: # scroll every 4 elements or so
        listBox.send_keys(Keys.ARROW_DOWN)
    element = WebDriverWait(browser,5,poll_frequency=.2).until(EC.visibility_of((By.ID, item)))
    element.click
    counter += 1

同样,您需要javaScriptexecutor

下面是java方法,它可以在相同的方面帮助您。在python中引用并使用它。在python中,它与:-

private void scrollToElementAndClick(WebElement element) {
    int yScrollPosition = element.getLocation().getY();
    js.executeScript("window.scroll(0, " + yScrollPosition + ");");
    element.click();
}
如果不起作用,则使用(不推荐):-

JavascriptExecutor执行器=(JavascriptExecutor)驱动程序;
executor.executeScript(“参数[0]。单击();”,driver.findElement(By.));

希望它能帮助您:)

您也可以使用Robot方法向下滚动页面,如下所示:

        Thread.sleep(1000);

        Robot robot3 = new Robot();
        robot3.keyPress(KeyEvent.VK_PAGE_DOWN);
        robot3.keyRelease(KeyEvent.VK_PAGE_DOWN);

        Thread.sleep(1000);

    element = WebDriverWait(browser,5,poll_frequency=.2).until(EC.visibility_of((By.ID, item)))
    element.click
    counter += 1

嗨,谢谢你的回答!我尝试了您的解决方案,但不幸的是,它仍然无法滚动,但它仍然能够单击所有其他元素。:)如果您只想滚动,则可以使用我的答案滚动到元素并单击方法。。只需删除该代码中的点击,并在其上添加Guy代码。。我确实需要它来滚动和点击。我还应该提到我使用的是firefox,所以它不需要点击点。@JacobMolinNielsen你有什么错误吗?或者它只是不滚动?是的,我仍然得到错误:元素在点(1121.5276)处不可单击。其他元素将收到点击:谢谢你的回答,如果我不能让它与动作脚本一起工作,我可能会尝试JavascriptExecutor,但我很难在网上找到一些关于Python的好资源/为什么不推荐第二个选项?因为JavascriptExecutor直接在DOM上工作,它可能导致testcase成功,而testcase在实际场景中失败……嗨,谢谢你的回答!不幸的是,我没有使用Java,但我正在认真考虑它,因为我看到大多数Selenium社区都在使用它。
        Thread.sleep(1000);

        Robot robot3 = new Robot();
        robot3.keyPress(KeyEvent.VK_PAGE_DOWN);
        robot3.keyRelease(KeyEvent.VK_PAGE_DOWN);

        Thread.sleep(1000);

    element = WebDriverWait(browser,5,poll_frequency=.2).until(EC.visibility_of((By.ID, item)))
    element.click
    counter += 1