Selenium 等待不会等待元素可点击

5

我有一个动态加载的页面,其中包含一个按钮。我正在尝试使用C#绑定使用Selenium等待按钮可用以进行单击。我有以下代码:

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();

然而,这并不起作用。点击事件从未触发。Selenium脚本没有抛出异常警告“addInspectionButton”元素不存在。它只是无法单击它。如果在等待语句和获取按钮元素的行之间添加Thread.Sleep(3000),则可以正常工作。

我在这里是否没有正确使用ExpectedConditions.ElementToBeClickable?


看起来你使用得很正确... 你尝试过点击 wait.until 调用返回的网页元素了吗?例如:var button = wait.Until(ExpectedConditions.ElementToBeClickable(By.Id("addInspectionButton"))); - karina
我刚刚尝试了一下,结果和之前一样。如果我在获取按钮句柄和实际点击之间加入Thread.Sleep,奇怪的是它就可以工作了。无论如何,就像等待并没有真正等待按钮可点击一样。 - J. Nick Baughan
我认为我已经弄清楚了这个按钮具有动态绑定的事件。当页面加载并且Selenium点击按钮时,事件尚未绑定。这就是为什么sleep起作用的原因。据我所知,在Selenium中没有一种方法可以等待客户端事件绑定。 - J. Nick Baughan
1个回答

2
原来,一个事件是在按钮动态添加到页面后绑定的。所以按钮被点击了,但什么也没有发生。代码中放置睡眠线程只是给客户端事件绑定时间。
我的解决方案是点击按钮,检查预期结果,如果预期结果还没有出现在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
        }

你是如何设置事件的?听起来如果你使用更传统的 button.onclick = this_thing 方法,你可以通过 JavaScript 构建自己的等待,以验证该变量。 - karina
当我尝试自动化NetSuite时,我遇到了同样的问题。 - l33tHax0r

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接