0

我目前正在做一个关于网络自动化的小项目。它用于在现场轮盘赌休息室进行在线投注,

我的问题是这样的,因为这些是现场直播的事件,它们有适当的控件,可以在屏幕上向您显示内容,还可以控制何时以及何时不能对某个数字下注。

这些控件之一是出现和消失的 15 秒时钟,在可见和倒计时时您可以下注,当它用完时它会消失,您必须等待庄家旋转球并等待结果和时钟重新出现在您再次下注之前。

我希望自动化下注的整个过程以及在某些条件下发生的某些事情。

但是基于时钟何时可见,因为这是您唯一可以下注的时间,并且由于没有确定球会旋转和降落的时间,我唯一真正的选择是wait for the clock element可见(html它出现并重新- 出现在 chrome 上的检查器中(我认为这是ajax正在使用的))

所以我希望使用没有超时的流畅等待(它实际上只是等待元素出现,因为无论如何它都会出现)

有没有办法在 selenium 中进行“等待”(使用 java ),这样就没有超时,但你可以每秒轮询一次???例如,我知道有时 0 用于表示没有时间限制...有人可以帮忙吗?

我在这里有一个代码示例,这是我唯一需要帮助的部分,我知道它必须很简单,并且不需要冗长的代码。

欢呼伙计们

WebElement myDynamicElement = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.id("my_element")));
4

3 回答 3

0

是的,有一种投票方式。但是你必须设置timeOut。这将为您提供解决方案。在这个初始化中,第三个参数是轮询时间。每隔 1 秒,它将对该元素进行轮询。

WebElement myDynamicElement = (new WebDriverWait(driver, 60 , 1))
.until(ExpectedConditions.presenceOfElementLocated(By.id("my_element")));
于 2019-04-02T13:00:03.137 回答
0

我不明白这怎么可能。这是该until方法的实现方式:

    def until(self, method, message=''):
    """Calls the method provided with the driver as an argument until the \
    return value is not False."""
    screen = None
    stacktrace = None

    end_time = time.time() + self._timeout
    while True:
        try:
            value = method(self._driver)
            if value:
                return value
        except self._ignored_exceptions as exc:
            screen = getattr(exc, 'screen', None)
            stacktrace = getattr(exc, 'stacktrace', None)
        time.sleep(self._poll)
        if time.time() > end_time:
            break
    raise TimeoutException(message, screen, stacktrace)

如您所见,当前时间与end_time调用函数的时间加上超时时间进行了比较。为了解决您的问题,我会使用相当多的秒数。

于 2019-04-02T21:57:55.003 回答
0

当您尝试click()在元素上调用时,presenceOfElementLocated()您需要使用而不是使用elementToBeClickable(),您可以使用以下任一Locator Strategies

  • 使用cssSelector

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("cssSelector_my_element"))).click();
    
  • 使用xpath

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("xpath_my_element"))).click();
    

在上述代码解决方案中,轮询设置为defaultie 500 ms。您可以将轮询设置1 sec如下:

  • 使用cssSelector

    new WebDriverWait(driver, 20, 1).until(ExpectedConditions.elementToBeClickable(By.cssSelector("cssSelector_my_element"))).click();
    
  • 使用xpath

    new WebDriverWait(driver, 20, 1).until(ExpectedConditions.elementToBeClickable(By.xpath("xpath_my_element"))).click();
    
于 2019-04-02T12:29:42.227 回答