首页 > 解决方案 > StaleElementException 单击接受条款

问题描述

我在注册 selenium 帐户时尝试单击接受条款复选框。我的代码似乎可以工作,但它只适用于我的一些客户计算机。对于那些它不起作用的人,它会抛出一个 staleelementexception。我在网上寻找一种方法来处理它,例如

    
            bool result = false;
            int attempts = 0;
            Thread.Sleep(500);
            
            while (attempts < 100)
            {
                Thread.Sleep(700);
                try
                {

                    driver.Navigate().Refresh();
                    IJavaScriptExecutor javascriptExecutor = (IJavaScriptExecutor)driver;
                    Actions action = new Actions(driver);
                    IWebElement db = driver.FindElement(By.XPath("/html/body/div[1]/div/div[2]/form/div[1]/label/span[2]"));
                    action.MoveToElement(db).Build().Perform();
                    javascriptExecutor.ExecuteScript("arguments[0].click();", db);
                    result = true;
                    
                    break;
                }
                catch (WebDriverException ee)
                {}
                attempts++;
            }

            nextPage(driver, wait);

我也尝试过使用驱动程序单击它并单击操作,但对于某些用户似乎没有任何效果。我处于不知道解决方案或不知道我还能做什么的地步。

更新 1:虽然我在评论中提到了这一点,但我仍然收到过时的元素,但我似乎找到了原因。使用特定国家/地区代理时,似乎会抛出此问题。现在元素仍然存在,但为什么代理会导致这种情况发生?

标签: c#seleniumselenium-chromedriver

解决方案


陈旧的元素通常意味着 DOM 从您找到该元素的那一刻起就发生了变化。您可以尝试以下几件事:

  • 检查页面并尝试确定这些用户的变化。可能MoveToElement会触发工具提示或某些类进行更改。如果您可以识别此类更改,则可以等待它完成然后获取元素
  • 尝试使用流利的等待,如此处所述
  • 尝试在识别元素后立即单击它driver.findElement(by.xpath(xpath)).click();

注意:您在代码段中使用的 JavaScript 单击对于 CLickIntercepted 异常非常有效,而对于 StaleElements 则不然。无论您如何单击该元素都将过时


推荐阅读