我目前正在做一个有关Web自动化的小项目。用于在现场轮盘休息室进行在线投注,
我的问题是,由于这些是直播事件,因此它们具有控件,可以在屏幕上向您显示内容,还可以控制何时以及何时不能对数字下注。
其中一个控制项是一个15秒的时钟,它出现和消失,而可见并倒计时,您可以下注,当它用完时,它消失,您必须等待发牌手旋转球并等待结果和时钟重新出现,然后才能再次下注。
我希望使下注和在某些情况下发生的某些事情的整个过程自动化。
但是基于该时钟何时可见,因为这是您唯一可以下注的时间,并且由于没有确定的时间球会旋转并着陆,所以我唯一的选择是wait for the clock element
可见(html
会出现并重新出现在chrome上的检查器中(我假设这是ajax
被使用))
所以我希望使用没有超时的流畅等待(它实际上只是等待元素出现,因为无论如何都会出现)
有什么方法可以在硒中(使用java)进行“等待”,以便没有超时,但是您可以每秒轮询一次?例如我知道有时候0用来表示没有时间限制...任何人都可以帮忙吗?
我有一个代码示例,这是我需要帮助的唯一部分,我知道它必须很简单,不需要冗长的代码。
欢呼声
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.id("my_element")));
答案 0 :(得分: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();
在上述代码解决方案中,轮询被设置为default
,即 500 ms
。您可以将 polling 设置为 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();
答案 1 :(得分:0)
是的,有一种轮询方法。但是您必须设置timeOut。这将为您提供解决方案。在此初始化中,第三个参数是轮询时间。每隔1秒钟便会对该元素进行轮询。
WebElement myDynamicElement = (new WebDriverWait(driver, 60 , 1))
.until(ExpectedConditions.presenceOfElementLocated(By.id("my_element")));
答案 2 :(得分: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
进行比较,function mountRecipient(user_email){
window.parent.console.log(user_email);
}
是函数被调用的时间加上超时时间。
为了解决您的问题,我将花费大量的时间。