【问题标题】:Selenium is misclicking硒点击错误
【发布时间】:2016-09-29 17:09:19
【问题描述】:

我试图让 Selenium 单击一个按钮,Selenium 必须滚动才能单击该按钮。但是发生的情况是,当 Selenium 向下滚动时,按钮会位于粘滞栏后面,而 Selenium 会单击粘滞栏而不是按钮。

我正在使用 Firefox 网络驱动程序。

我尝试了以下方法:

DesiredCapabilities.FIREFOX["elementScrollBehavior"] = 1
self.driver = webdriver.Firefox()

当我将elementScrollBehavior 设置为1 时,它根本不会滚动。

如何使 Selenium 正确向下滚动,以使按钮不会出现在粘性栏后面?

-edit-
DesiredCapabilities.FIREFOX["elementScrollBehavior"] = 1

现在可以工作,但仍然无法单击按钮。即使是粘性栏现在也不会妨碍您。

【问题讨论】:

    标签: python python-2.7 python-3.x selenium selenium-webdriver


    【解决方案1】:

    你可以这样实现:

    driver = webdriver.Firefox()
    driver.get("http://somewebpage.example")
    time.sleep(5)
    
    while True:
        try:
            # Edit this to how you're currently scrolling
            driver.execute_script("window.scrollBy(0, 150);")
            button = driver.find_element(By.XPATH, YOUR_BUTTON_XPATH)
            button.click()
            break
        except WebDriverException:
            driver.execute_script("window.scrollBy(0, -100);")
            time.sleep(2)
    

    如果您的脚本滚动到远处并引发异常,它将捕获此错误并将页面向后滚动 100 像素。

    这应该保证你的按钮被点击,它会不断地向下移动 50px 直到找到它,但你可以实现你的正常滚动方式,然后捕捉 WebDriverException 并向上滚动几个像素。

    【讨论】:

    • 现在:我有这样的pastebin.com/EVNiSF6P selenium 脚本太快了是否有另一个基于 Selenium 的替代 time.sleep() 我尝试使用隐式等待,但这似乎不起作用。
    • 是的,您可以执行以下操作来等待页面上出现一个元素。例如,在加载页面后,等待用户名字段显示在屏幕上,这将等待至少 10 秒除非出现用户名元素,否则它将继续: username_element = WebDriverWait(driver, 10).until(lambda d: d.find_element_by_id('username'))
    • 这里的问题是它在滚动时会立即点击,因为我得到了Element is not clickable at point (327.5, 15). Other element would receive the click。所以它无法点击,因为滚动速度不够快。它会在滚动时尝试单击按钮。
    • 我不明白。您要单击的元素在哪里?如果您滚动得太远并且屏幕上还有其他东西覆盖它,则异常块应该稍微向上滚动,足以使其可见(其中地址:如何使 Selenium 正确向下滚动以使按钮不会得到在粘性栏后面?)
    • 一个简单的 time.sleep 应该让脚本在点击之前等待(这是我使用的),虽然 WebDriverWait 可能是一个更好的解决方案,如果你可以定制它以适应你的脚本。
    【解决方案2】:

    您可以尝试使用 javascript 滚动到元素,然后使用偏移量再滚动一点 例如在 c# 中。

    IJavaScriptExecutor jse = (IJavaScriptExecutor)driver;
    jse.ExecuteScript("arguments[0].scrollIntoView(true)", element)
    jse.ExecuteScript("window.scrollBy(0,50)");
    

    【讨论】:

    • 也许有人可以把它转换成python
    猜你喜欢
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 2020-03-16
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多