单击元素后Javascript延迟等待下一页加载

时间:2018-02-07 12:51:18

标签: javascript automated-tests settimeout delay synchronous

我正在为我的应用程序创建一个测试程序,我希望在我的代码中有一个同步的动作延迟,以便等待下一页加载,然后搜索我需要的选择器。 我已经使用了setTimeout但返回不在那里工作。

var myelement = "click button here";

if (myelement.indexOf("click")>=0) {
    for (var i=1; i<=4 ; i++) {
        title = document.querySelector("#element > .row:nth-of-type("+i+") > .title").textContent;
        if ( title == "title x" ) {
            document.querySelector("#element > .row:nth-of-type("+i+") > .button > a").click();
            //wait for 5sec to load next page
            var content = document.querySelector("#message").textContent.trim();
            if (content == "my content" ) { 
                return true; 
            }
        }
    }
}

如果我没有插入延迟,第9行(var content)会返回错误TypeError: Cannot read property 'textContent' of null

这里有什么帮助吗? 感谢

2 个答案:

答案 0 :(得分:0)

网页没有没有服务器和数据库,cookie或localStorage的状态,因此如果您尝试执行setTimout并重新加载页面,您将丢失状态并且函数将不会触发。

您需要使用 localStorage 之类的内容来保存页面加载之间的状态。检查您的州的价值,并在页面加载时采取适当的措施。

var myelement = "click button here";

// this will be run on page load
// if the localStorage.content is set you have passed from the previous page
if (localStorage.content) {
  // check the value
  if (content == "my content") {
    console.log(localStorage.content, true)
    // reset the localStorage value
    localStorage.removeItem('content')
  }
}

if (myelement.indexOf("click") >= 0) {
  for (var i = 1; i <= 4; i++)(function(i) {
    title = document.querySelector("#element > .row:nth-of-type(" + i + ") > .title").textContent;
    if (title == "title x") {
      document.querySelector("#element > .row:nth-of-type(" + i + ") > .button > a").click();
      // set the localStorage value for the next page load
      localStorage.content = document.querySelector("#message").textContent.trim();
      window.location.href = '/somewhere-else'
    }
  })(i)
}

答案 1 :(得分:0)

不要使用 setTimeout ,它在循环中效果不佳。因此,请使用 sleep ,这在以下

中实现
if(isset($_POST['search'])){

            $sql = 'SELECT * FROM sales';
            $where = array();
            $params = array();

            if (!empty($_POST['startdate']) && !empty($_POST['enddate'])) {
                $where[] = "submitdate BETWEEN :a AND :b";
                $params[':a'] = $_POST['startdate'];
                $params[':b'] = $_POST['enddate'];
            }

            if (!empty($_POST['recordstatus'])) {
                $where[] = "status = :status";
                $params[':status'] = $_POST['recordstatus'];
            }

            if(count($where) > 0)
                $sql .= ' WHERE ' . implode('AND', $where);

            $stmt = $DB_con->prepare($sql);

            foreach($params as $param => $value) {
                $stmt->bindParam($param, $value);
            }
            $stmt->execute();

            for($i=0; $row = $stmt->fetch(); $i++) {
                echo $row ['submitdate'];
                echo $row['status'];
            }

因此,在循环中,您可以使用我刚刚为您创建的function sleep(mills){ var t=new Date().getTime(); // Store current Time; while((new Date().getTime()-t)<mills); } 函数。