暂停所有线程而无需等待

时间:2018-09-09 19:11:47

标签: java multithreading selenium thread-safety

我正在尝试用硒构建一个机器人。问题是该网站有时会不经通知即注销我。我知道如何检测它,并且知道如何处理它。问题在于,如果服务器注销了我,则在每行之前进行检查是不合理的。这就是我可以做的:

class ...():
    pos_float = [0,0]
    ...
    def movement(self):
        self.pos_float[0] += self.vel[0]
        self.pos_float[1] += self.vel[1]

        self.pos[0] = int(self.pos_float[0])
        self.pos[1] = int(self.pos_float[1])

但是检查我是否需要重新连接每条线并不是一个好的解决方案。 我考虑过要建立一个可以一直检查是否断开连接的线程,但是在发现断开连接后重新连接到服务器之前,我不知道如何暂停主线程

4 个答案:

答案 0 :(得分:1)

您可以在侧线程的while循环内运行检查,如果服务器断开您的连接,请停止主线程。重新连接后,请重新启动。

答案 1 :(得分:1)

您可以拥有与自己的解决方案类似的解决方案,但是您可以使用ChromeDriver来代替为EventFiringWebDriver创建自己的包装器。

答案 2 :(得分:0)

登出您的网站似乎超时。据我所知,您正在非生产环境中进行测试,请查看如何将time_out设置为0(不过期)。

线程解决方案太笨拙,单个非同步丢失会产生无法检测到的错误结果。

答案 3 :(得分:0)

我通过用自己的类包装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();
}