2012-10-19 9 views
7

Używam testów Selenium 2 (napisanych w języku C#), które wybierają wartości z kontrolki "select". Wybór powoduje powrót do serwera, który aktualizuje stan strony. W związku z tym wykonuję ręczne oczekiwanie (thread.sleep) po wybraniu wartości, aby poczekać na zmianę strony. i działa dobrze z Thread.Sleep. Jednak Thread.Sleep jest zły pomysł, aby korzystać z wielu powodów, więc kiedy wyjąć wszystkie moje Thread.Sleep wiersza kodu, to wszystkie moje przypadki testowe rozpadnie i próbowałem WebDriverWait, pośrednio i wyraźny brak roboty i bardzo frustracjiWebDriverWait lub ImplicitlyWait or ExplictlyOd niczego nic nie działa

poniżej przykładowy kod, który próbowałem ....

// WebDriverWait

public IWebElement WaitForElement(By by) 
{ 
      // Tell webdriver to wait 
      WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30)); 
      wait.PollingInterval = TimeSpan.FromSeconds(2); 
      wait.IgnoreExceptionTypes(typeof(NoSuchElementException), typeof(NoSuchFrameException)); 
      wait.IgnoreExceptionTypes(typeof(StaleElementReferenceException), typeof(StaleElementReferenceException)); 

      IWebElement myWait = wait.Until(x => x.FindElement(by)); 
      return myWait; 
} 

Tried to zbyt:

WebDriverWait wait = new WebDriverWait(new SystemClock(), driver, TimeSpan.FromSeconds(30), TimeSpan.FromMilliseconds(100)); 

// Pośrednio:

driver.Manage().Timeouts().ImplicitlyWait(new TimeSpan(0, 0, 30)); 

// Explicit Wait:

IWebDriver driver = new FirefoxDriver(); 
driver.Url = "http://somedomain/url_that_delays_loading"; 
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30)); 
IWebElement myDynamicElement = wait.Until<IWebElement>((d) => 
    { 
     return d.FindElement(By.Id("someDynamicElement")); 
    }); 

Odpowiedz

0

spróbuje użyć

new WebDriverWait(driver, 30).until(ExpectedConditions.presenseOfElementLocated(byLocator)); 
+0

tak zrobiłem próbował, ale nie działa. –

1

Oto, co działa dla mnie ->

WebDriverWait wait = new WebDriverWait(browser, new TimeSpan(0, 0, 30)); 

element = wait.Until<IWebElement>((driver) => 
    { 
    return driver.FindElement(By.Name("name_of_element"))); 
    }); 

Możesz także zrobić przez ID - >

WebDriverWait wait = new WebDriverWait(browser, new TimeSpan(0, 0, 30)); 

element = wait.Until<IWebElement>((driver) => 
    { 
    return driver.FindElement(By.Id("id_of_element"))); 
    }); 

Nie widząc więcej kodu, trudno będzie określić, dlaczego nie działa.

+0

daj mi znać, co jeszcze potrzebujesz kodu, więc mogę go wkleić i pozwól mi spróbować –

0

znajdę rozwiązanie stackoverflow :) i to działa:

click on partialLinkText("Exit") 
remote.manage().timeouts().implicitlyWait(50, TimeUnit.SECONDS) 
remote.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS) 
// Thread.sleep(7000) // for js-work 
(new WebDriverWait(remote, 245)).until(presenceOfElementLocated(By.partialLinkText("""Entry for > technician"""))) 
// Thread.sleep(3000) // for js-works