c# - 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:虽然我在评论中提到了这一点,但我仍然收到过时的元素,但我似乎找到了原因。使用特定国家/地区代理时,似乎会抛出此问题。现在元素仍然存在,但为什么代理会导致这种情况发生?
解决方案
陈旧的元素通常意味着 DOM 从您找到该元素的那一刻起就发生了变化。您可以尝试以下几件事:
- 检查页面并尝试确定这些用户的变化。可能
MoveToElement
会触发工具提示或某些类进行更改。如果您可以识别此类更改,则可以等待它完成然后获取元素 - 尝试使用流利的等待,如此处所述
- 尝试在识别元素后立即单击它
driver.findElement(by.xpath(xpath)).click();
注意:您在代码段中使用的 JavaScript 单击对于 CLickIntercepted 异常非常有效,而对于 StaleElements 则不然。无论您如何单击该元素都将过时
推荐阅读
- macos - 在 Mac 上的 NSOutlineView 中更改拖动开始时的选定项目
- amazon-web-services - AWS Elastic Beanstalk (.ebextension) 配置 - IntelliJ 中的支持 .config 文件
- dataframe - 用于爆炸列的 Pyspark 数据框过滤器
- python - 在python的一行中存储一个特定的值
- rest - power bi:克隆报告未在可视化中显示数据
- java - 如何在 Play-With-Docker-Lab 中指定 java 的文件夹路径?
- c# - 使用自定义构建路径将外部 dll 添加到构建目录
- python-3.x - 如何使用按钮关闭 AIY 语音套件
- c# - 为什么数据目标找不到我的模态ID?
- sql - SQL 喜欢但不喜欢