嗨,我正在使用Selenium Webdriver来自动化我的脚本,并且我在脚本中使用了wait.until条件来单击html页面下方的传递bttn。问题是硒正在找到我的元素,但是由于Java脚本重新加载了某些元素。并且交付bttn仅在重新加载后才可单击。我的硒脚本抛出“陈旧元素引用:元素未附加到页面文档中”。我应该怎么做才能克服此错误。
tmp
屏幕截图:
答案 0 :(得分:0)
有两种方法可以解决您的问题。
1)使用Async运行代码,例如,您可以“等待”一行代码。
function async(test1){
await driver.findElement(By.id("");
driver.click();
});
或者您也可以执行以下操作
2)
function (test1) {
let element = driver.findElement(By.id(elementId));
driver.wait(until.elementIsVisible(element), 10000).then(async () =>{
element.click();
});
此等待2是我在代码中使用的等待,它始终有效。
一种非常野蛮的方法是添加一个荒谬的等待时间,以检查它是否不是显示类似于等待问题的错误
driver.sleep(10000);
or
thread.sleep(10000);
(除非另有定义,否则测量单位为毫秒)
请让我知道这些解决方案是否不能解决问题。
答案 1 :(得分:0)
正如 Jack 所建议的,您可以使用异步,但是我总是使用infinte while循环
我在下面给出的代码在python中,但是您也可以在java中使用逻辑
DirectoryInfo di = new DirectoryInfo(@"d:\sources\");
DirectoryInfo[] dirs = di.GetDirectories("*", SearchOption.AllDirectories)
.Where(q => q.Name.Equals("name1", StringComparison.InvariantCultureIgnoreCase) ||
q.Name.Equals("name2", StringComparison.InvariantCultureIgnoreCase));
我知道无限循环不是比异步更好的方法,但是如果在某些情况下您不能使用异步,则可以使用异步。另外请记住将超时用于循环,否则当页面无响应或尚未加载时,您将无限循环。
答案 2 :(得分:0)
它仍然引发此问题的原因是因为您没有正确处理异常,这是对它仍然引发陈旧元素错误的一种响应。
在您的项目中添加类似的内容,如果您查看我的代码的底部,您会发现我已经添加了异常来捕获错误,因此它不会像以前那样影响代码。
driver.findElement(By.id(buttonID)).then(pageElement => {
driver.wait(until.elementIsVisible(pageElement), 10000).then( () => {
pageElement.click();
next();
})
.catch(ex => {
console.log(ex.message, ex.stack)
});
}).catch(ex => {console.log(ex.message, ex.stack)});
这是我如何使用catch的示例,但是您在函数中拥有的许多诺言将需要更多的catch,如果将鼠标悬停在Visual Code / Studio中的某个元素上,您将能够查看它是否抛出了答应与否。