Selenium WebDriver如果条件耗费大量时间

时间:2018-06-08 12:07:08

标签: java selenium

最近我编写了以下代码来点击以下任何可见的元素:

目的:基本上是一个永无止境的循环,再次重复相同的动作,即点击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);
        }
}

2 个答案:

答案 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();
    }       
}