最近我编写了以下代码来点击以下任何可见的元素:
目的:基本上是一个永无止境的循环,再次重复相同的动作,即点击3个按钮。
问题:当我运行代码时,似乎需要在1秒到7秒之间的任意时间点击一个按钮,硬件页面会立即成功加载。因此,我很想知道延迟操作的代码是什么?和有没有有效的方法来缩短时间?
battle(WebDriver driver1)
{
try { if(driver1.findElements(By.xpath("....")).size()!= 0)
{
driver1.findElement(By.xpath("....")).click();
}
if(driver1.findElements(By.xpath("....")).size()!= 0)
{
driver1.findElement(By.xpath("....")).click();
}
if(driver1.findElements(By.xpath("....")).size()!= 0)
{
driver1.findElement(By.xpath("....")).click();
}
battle(driver1);
}
catch(Exception e)
{
battle(driver1);
}
}
答案 0 :(得分:0)
这里你使用xpath点击按钮。通常,xpath与ID和CSS相比需要更多时间。请尝试使用ID和CSS然后你可以检查执行时间的差异。您可以参考此link来了解为什么xpath需要更多时间来执行。
答案 1 :(得分:0)
如果我猜测,你可能有一个隐含的等待集。每当您查找不存在的元素时,Selenium将等待隐式时间(5秒或任何设置),直到达到超时,然后继续。我的建议是完全删除隐式等待,看看它是怎么回事。如果您需要等待,请为每个方案添加WebDriverWait
。
另一个可能是次要的问题是,对于要点击的每个元素,您要抓取页面两次...一次查看是否存在然后再次单击该元素。您可以将代码更改为仅刮取页面一次,将结果存储在变量中,检查集合是否为空,如果元素为非空,则单击该元素。
由于您重复代码3次,我会编写一个处理该代码的函数,然后根据需要调用它。
我还有一些其他的事情发生了变化。一个例子是,无论如何,您似乎总是希望运行battle
。而不是在异常后递归调用battle
并调用battle
,而只需添加一个永不结束的while循环。话虽如此,一旦你修改了这个代码并在某个地方使用它,你可能会想要添加一个转义...用户退出程序的某种方式,而你的同时将取决于设置的那个标志,但这是另一个讨论。 / p>
battle(WebDriver driver1)
{
while (true)
{
clickIfExists(By.xpath("xpath1"));
clickIfExists(By.xpath("xpath2"));
clickIfExists(By.xpath("xpath3"));
}
}
public void clickIfExists(By locator)
{
List<WebElement> e = driver1.findElements(locator);
if (e.size() > 0)
{
e.get(0).click();
}
}