Selenium等待元素仅在调试选择的测试时有效

时间:2015-07-16 05:30:44

标签: c# selenium testing automated-tests selenium-chromedriver

我有使用ajax构建的网页。 在代码中有一个方法:

bool onetaskCompleted= false;
private readonly Object obj = new Object();

private async Task<List<PingReply>> PingAsync()
{
   Ping pingSender = new Ping();
   var tasks = theListOfIPs.Select(ip => pingSender.SendPingAsyn(ip,2000));
   List<Task> continuetask = new List<Task>();
   foreach(Task t in taks)
   {
     continuetask.Add(t.ContinueWith(Action));
   }

   var results = await Task.WhenAll(continuetask);

   return results.ToList();
}

private void ContinuationAction()
{
     lock(obj)
     {
       if(!onetaskCompleted) 
          onetaskCompleted = true;
     }
     if(!onetaskCompleted)
     {
       //execute code 
     }
}

如您所见,我只需点击,然后等待下一个窗口显示。 当我通过'run selected test'运行此代码时,测试会在等待时冻结并获得时间。但窗口在页面上可见。我可以在浏览器中看到它。 如果我通过'debug selected test'运行此代码,一切正常。我甚至不需要设置断点。调试模式就足够了。选择器还可以。我仔细检查了一下。 这是我的WaitFor方法:

public static void ProceedButtonClick()
{
    Driver.WaitForAndIsEnabledFind(ProceedButtonElementBy).Click();
    Driver.WaitFor(LoadedPageFinishedIdentifierBy);
}

2 个答案:

答案 0 :(得分:0)

总是尝试使用以下方法进行显式等待,这将继续每3秒检查一次元素并单击。

方法:

  public static void waitForElementToBeVisible(final WebDriver driver,
        final By locator) throws RuntimeException {
    Wait<WebDriver> wait = new WebDriverWait(driver, WAIT_TIMEOUT);
    try {
        wait.until(new ExpectedCondition<WebElement>() {
            public WebElement apply(WebDriver driver) {
                // driver.switchTo().defaultContent();
                WebElement element = driver.findElement(locator);
                if (element.isDisplayed()) {
                    return element;
                }
                return null;
            }
        });
    } catch (Exception e) {
        throw new RuntimeException("Exception while waiting for " + locator
                + ". Exception:" + e + " on " + driver.getCurrentUrl());
    }
}

答案 1 :(得分:0)

在找到元素之前使用此代码:

try {
        Thread.sleep(10000);
    } catch(InterruptedException ex) {
        Thread.currentThread().interrupt();
    }