代码之家  ›  专栏  ›  技术社区  ›  Roni

暂停所有线程而不等待

  •  2
  • Roni  · 技术社区  · 6 年前

    我正在尝试建立一个机器人与硒。问题是,不时有网站登出我没有任何通知。我知道如何发现它,我知道如何处理它。问题是,这是不合理的检查之前,每一行如果服务器注销我。这就是我能做的:

        ChromeDriver driver = new ChromeDriver();
        driver.get(url);
        Connect(driver, loginData);
        if(isConnected(driver) == false)
            reconnect(driver, loginData);
        driver.findElement(By.id("element-id")).click();
        if(isConnected(driver) == false)
            reconnect(driver, loginData);
        ...
    

    但是检查是否需要重新连接每条线路不是一个好的解决方案。 我想做一个线程,检查所有的时间,如果我断开,但我不知道如何暂停主线程,直到我重新连接到服务器时,我发现我断开了连接

    4 回复  |  直到 6 年前
        1
  •  1
  •   Arnon Axelrod    6 年前

    您可以有一个类似于自己的解决方案,但不是创建自己的 ChromeDriver EventFiringWebDriver 为了这个。

        2
  •  1
  •   javajav    6 年前

        3
  •  0
  •   jay    6 年前

    你注销的网站似乎超时了。我猜,您是在非生产环境中进行测试的,请查看如何设置timeout=0(no expire)。

    线程解决方案将过于笨拙,单个非同步未命中可能会产生无法检测的错误结果。

        4
  •  0
  •   Roni    6 年前

    我通过包装解决了这个问题 ChromeDriver

        public java.util.List<WebElement> findElements(By by) throws disconnectException {
        if(keepLogin) {
            if(checkConnectionOver()) {
                throw new disconnectException();
            }
        }
        return driver.findElements(by);
    }
    
    public WebElement findElement(By by) throws disconnectException {
        if(keepLogin) {
            if(checkConnectionOver()) {
                throw new disconnectException();
            }
        }
        return driver.findElement(by);
    }
    
    public Object executeScript(String script, Object... args) throws disconnectException {
        if(keepLogin) {
            if(checkConnectionOver()) {
                throw new disconnectException();
            }
        }
        return driver.executeScript(script, args);
    }
    
    public void get(String url) {
        driver.get(url);
    }
    
    public String getCurrentUrl() {
        return driver.getCurrentUrl();
    }