Selenium Wait不等待元素是可点击的

本文关键字:元素 Wait 等待 Selenium | 更新日期: 2023-09-27 18:04:25

我有一个动态加载的页面,其中包含一个按钮。我正试图等待按钮可用来点击使用c#绑定的硒。我有以下代码:

WebDriverWait wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(30));
        wait.Until(ExpectedConditions.ElementToBeClickable(By.Id("addInspectionButton")));
        var button = Driver.Instance.FindElement(By.Id("addInspectionButton"));
        button.Click();

这不起作用。click事件永远不会触发。selenium脚本不会抛出一个异常,警告ID为"addInspectionButton"的元素不存在。它就是不能点击它。如果我在等待语句和获取button元素句柄的行之间添加Thread.Sleep(3000),它就会起作用。

我没有使用ExpectedConditions吗?ElementToBeClickable正确吗?

Selenium Wait不等待元素是可点击的

事实证明,在按钮被动态添加到页面之后,一个事件被绑定到按钮上。所以按钮被点击了,但什么也没发生。在代码中放置的睡眠线程只是给客户端事件绑定时间。

我的解决方案是单击按钮,检查预期的结果,如果预期的结果还没有在DOM中,然后重复。

由于预期的结果是打开一个表单,所以我像这样轮询DOM:

button.Click();//click button to make form open
        var forms = Driver.Instance.FindElements(By.Id("inspectionDetailsForm"));//query the DOM for the form
        var times = 0;//keep tabs on how many times button has been clicked
        while(forms.Count < 1 && times < 100)//if the form hasn't loaded yet reclick the button and check for the form in the DOM, only try 100 times
        {
            button.Click();//reclick the button
            forms = Driver.Instance.FindElements(By.Id("inspectionDetailsForm"));//requery the DOM for the form
            times++;// keep track of times clicked
        }