当您的页面javascript重新加载元素时,如何应用等待时间

时间:2018-11-08 14:37:38

标签: javascript selenium testing selenium-webdriver automated-tests

嗨,我正在使用Selenium Webdriver来自动化我的脚本,并且我在脚本中使用了wait.until条件来单击html页面下方的传递bttn。问题是硒正在找到我的元素,但是由于Java脚本重新加载了某些元素。并且交付bttn仅在重新加载后才可单击。我的硒脚本抛出“陈旧元素引用:元素未附加到页面文档中”。我应该怎么做才能克服此错误。

tmp

屏幕截图:

 The screenshot of htm code

3 个答案:

答案 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中的某个元素上,您将能够查看它是否抛出了答应与否。