当前位置: 首页 > 知识库问答 >
问题:

Selenium WaitDriver不等待元素可点击

辛盛
2023-03-14

当我点击一个按钮时,它会显示一个带有另一个按钮的表单,我想点击其中一个。这是一个视频(非常短),请观看http://screencast.com/t/zyliSemW1s1

所以我点击“买票”按钮,简单如下:

button.Click();

然后我等待下一个按钮被点击。

我使用下一个代码:

WebDriverWait wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(15));
IWebElement element = wait.Until(ExpectedConditions.ElementToBeClickable(myButton));

之后,我点击我等待的按钮:

element.Click();

我得到错误:元素在这一点上是不可点击的。

据我所知,该方法预期的条件。ElementToBeClickable()等待2个条件:元素可见和元素启用。

当我使用线程时。Sleep(3000)在点击第二个按钮之前,代码工作,按钮可点击。

我看到了类似的问题,解决方案是等待这个按钮的处理程序:硒等待不会等待元素可点击

但如果我不知道该怎么办?我认为它由jQuery处理,我使用下一个代码等待它停止执行:

var ajaxIsComplete = (bool)
    ((IJavaScriptExecutor)Driver).ExecuteScript("return jQuery.active == 0");

如果返回“false”,我等待并再次检查。

但还是不行。

现在我的流程是这样的:

  1. 我点击按钮“购买门票”
  2. 我等到jQuery停止执行
  3. 我一直等到元素可以使用Exected条件单击。ElementToBeClickable()方法
  4. 我单击该元素,它返回一个错误,即它不可单击。

请告诉我我的流程中有什么问题,以及如何管理它。

更新:我正在添加按钮的超文本标记语言代码:

我点击这个:

<button class="btn btn-warning play-now" name="button" type="submit">Buy Tickets</button>

然后等待这个:

<img alt="Credit Card" class="merchant" src="https://numgames-production.s3.amazonaws.com/uploads/merchant/image/21/CC_Offline.png?AWSAccessKeyId=AKIAJ2Q64HPERGHAJJUA&amp;Expires=1470984765&amp;Signature=Qj%2BFSQ3ElctkY6KTMfzp%2FedPjPo%3D">

共有3个答案

微生耘豪
2023-03-14

不要使用elementtobelickable,而是尝试使用presenceOfElementLocated。我认为您期望的元素在DOM中不存在,所以请尝试先使用presenceOfElementLocated。一旦它出现在DOM上,就使用ElementToBeClickable。

杜元明
2023-03-14

这是处理任何异步(AJAX)页面的典型问题。

你不需要使用任何“神奇”的方法,比如睡眠、jquery.active和预期条件。

网页通常是按照用户在操作结束时看到的方式构建的,比如一些消息出现,或者一些按钮被启用。我相信在你的情况下,在你点击“买票”后也会发生类似的事情-你需要注意这一点,并在代码中等待。

该等待需要针对您的特定情况使用显式等待来执行。这是管理异步页面(包括尚未可单击的元素)的唯一可靠方法。

您可以在我的博客文章“Web自动化(Selenium)中处理AJAX的方法”中看到更详细的概述

公西俊民
2023-03-14

丹尼斯,

正如OP评论中提到的,这里有一些小的扩展方法可以帮助您完成任务:

public static void WaitForAjax(this IWebDriver driver, int timeoutSecs = 10, bool throwException = false)
{
    for (var i = 0; i < (timeoutSecs*10); i++)
    {
        var javaScriptExecutor = driver as IJavaScriptExecutor;
        var ajaxIsComplete = javaScriptExecutor != null && (bool)javaScriptExecutor.ExecuteScript("return jQuery.active == 0");
        if (ajaxIsComplete) return;
        Thread.Sleep(100);
    }
    if (throwException)
    {
        throw new Exception("WebDriver timed out waiting for AJAX call to complete");
    }
}

public static bool ElementExists(this IWebDriver driver, By condition)
{
    return ElementExists(driver, condition, new TimeSpan());
}

public static bool ElementExists(this IWebDriver driver, By condition, TimeSpan timeSpan)
{
    bool isElementPresent = false;

    if (timeSpan == default(TimeSpan))
    {
        timeSpan = TimeSpan.FromMilliseconds(15000);
    }

    var driverWait = new WebDriverWait(driver, (TimeSpan)timeSpan);
    driverWait.IgnoreExceptionTypes(typeof(WebDriverTimeoutException));
    isElementPresent = driverWait.Until(x => x.FindElements(condition).Any());

    return isElementPresent;
}

public static IWebElement FindElementAfterWait(this IWebDriver driver, By condition, int fromSeconds = 90)
{
    bool isElementPresent = false;
    IWebElement singleElement = null;

    var driverWait = new WebDriverWait(driver, TimeSpan.FromSeconds(fromSeconds));
    driverWait.IgnoreExceptionTypes(typeof(WebDriverTimeoutException));

    try
    {
        isElementPresent = driverWait.Until(ExpectedConditions.ElementExists(condition)) != null;

        if (isElementPresent)
        {
            singleElement = driver.FindElement(condition);
        }
    }
    catch
    {
        // log any errors
    }

    return singleElement;
}

用途:

bool elementExists = _driver.ElementExists(By.Id("submitButton"));

var submitButton = _driver.FindElementAfterWait(By.Id("submitButton"));
submitButton.Click();
_driver.WaitForAjax();

// then do other code stuff...

希望这些组合可以让你摆脱困境。

 类似资料:
  • 我有一个动态加载的页面,其中包含一个按钮。我正在尝试等待selenium使用C#绑定点击按钮。我有以下代码: 不过这不管用。click事件永远不会被触发。selenium脚本不会抛出异常警告ID为“addInspectionButton”的元素不存在。它只是不能点击它。如果我加一根线。Sleep(3000)在wait语句和我获得按钮元素句柄的那一行之间。 我没有使用预期条件.元素在这里正确点击吗?

  • 所以我们有一页医学专科。它原本只是英文的。因此,如果您搜索“neuro”,则HTML看起来类似于 然后他们添加了西班牙语,所以并不是所有的结果都会返回,但是只有西班牙语是可见的。一个新的 > 添加在底部。 是否有方法等待任何匹配xpath的元素可见?注意,visibilityOfAllElements()将不起作用,因为它们不会全部可见。 我想可以做的是,预先计算所有带有@id和“width”的元

  • 我将测试一个网络应用程序。在我的表中有一个按钮可以选择所有条目。我尝试过: selenium单击按钮,但什么也没发生。(还有send_Keys(Keys.Return))应用程序是用GXT开发的,我发现按钮后面有很多javascript。是否有可能等待事件加载器准备就绪?在单击之前等待可以解决问题,但不是自动测试的解决方案。

  • 问题内容: 我想知道是否可以告诉puppeteer等到显示的元素。 我有什么办法可以做到这一点? 问题答案: 我认为您可以为此使用功能。 要检查可用选项,请参阅github链接。

  • 问题内容: 我在Python 2.7中使用selenium,并且有以下代码,但是我正在寻找一种更有效的方法: 问题答案: 您无需使用一段时间。它已经等待您在WebDriverWait()函数中显示的时间。

  • 问题内容: 这个问题是由于总的中间在试图忠实于什么实际用户一样。所以我在想这种方法: 首先,而不是查找元素,然后单击: 编写单击以下内容的通用函数: 然后,当发生此异常时,请尝试以其他方式单击。 您认为这种方法可行吗? 问题答案: 请仔细阅读此堆栈溢出答案以更好地理解。 更新 我们也可以尝试 也请尝试如下 尝试使用Y坐标单击 尝试使用X坐标单击 希望这对您有帮助