2012-05-29 3 views
2

Я читал о том, как обращаться с AJAX в веб-селене. Существует много решений. Есть ли лучшее и правильное решение?selenium webdriver - как обращаться с вызовами ajax

Решения о которых я читал до сих пор являются:

1) Использование нити сна 2) Waitfor метод 3) ExpectedCondition 4) FluentWait 5) PresenceOfElementLocated

Спасибо!

ответ

0

Надежное решение для обработки компонентов ajax (как используется в моем случае) состоит в том, чтобы ждать, пока элемент будет виден на странице, используя API-интерфейс waitUntil() API-интерфейса webdriver.

В противном случае, для решения проблемы Ajax совсем не рекомендуется использовать threadleep().

-1

Возможно, вы захотите попробовать Apache Http Client, если хотите выполнить запрос ajax из своего теста. Вот какой код Groovy, который делает это. Шансы невелики, что вы используете Groovy, но это все равно должно быть информативным относительно Get & Post вообще с клиентом.

import groovy.util.Expando 
import org.apache.commons.httpclient.HttpClient 
import org.apache.commons.httpclient.HttpStatus 
import org.apache.commons.httpclient.methods.PostMethod 
import org.apache.commons.httpclient.methods.GetMethod 
import java.io.BufferedReader 
import java.io.InputStreamReader 
import org.apache.commons.httpclient.Header 
import java.net.URLDecoder 
import com.auto.utils.crypto.Crypto 

class ClientHttps { 
private HttpClient client = null 
private BufferedReader br = null 
private String cookieString = "" 
private crypto = new Crypto() 
def log 
public ClientHttps(log) { 
    this.log = log 
    client = new HttpClient(); 
    client.getParams().setParameter("http.useragent", "Mozilla/5.0 (Windows NT 6.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2") 
} 
public Expando get(String url) { 
    def startTime = System.nanoTime() 
    GetMethod method = new GetMethod(url) 
    Expando returnData = new Expando() 
    try { 
     log.info("cookieString = " + cookieString) 
     method.addRequestHeader("Cookie", cookieString) 
     method.addRequestHeader("Accept", "application/json") 
     int returnCode = client.executeMethod(method) 
     log.info("returnCode = " + returnCode) 
     if (returnCode == HttpStatus.SC_NOT_IMPLEMENTED) { 
      log.error("The Get method is not implemented by this URI") 
     } else { 
      if ((returnCode != HttpStatus.SC_OK) && (returnCode != HttpStatus.SC_MOVED_PERMANENTLY)) 
       assert false, "Bad Response Code" 
      br = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream())) 
      String readLine; 
      while(((readLine = br.readLine()) != null)) { 
       log.info(readLine) 
      } 
      Header [] respHeaders = method.getResponseHeaders() 
      respHeaders.each() { 
       log.info(it.getName() + " = " + it.getValue()) 
       returnData.setProperty(it.getName(), it.getValue()) 
      } 
     } 
     def endTime = System.nanoTime() 
     def duration = endTime - startTime; 
     def seconds = (double)duration/1000000000.0; 
     log.info("Get took = " + seconds + " seconds (Get url = " + url + ")") 
     return returnData; 
    } catch (Exception e) { 
     log.error(e.message, e) 
     return null 
    } finally { 
     method.releaseConnection() 
     if(br != null) try { 
      br.close() 
     } catch (Exception fe) { 
      log.info(fe.message, fe) 
     } 
    } 
} 
public Expando post(Expando postData) { 
    def startTime = System.nanoTime() 
    PostMethod method = new PostMethod(postData.getProperty("url")) 
    postData.getProperty("params").each() {method.addParameter(it.key, it.value)} 
    Expando returnData = new Expando() 
    try { 
     int returnCode = client.executeMethod(method) 
     log.info(returnCode) 
     if(returnCode == HttpStatus.SC_NOT_IMPLEMENTED) { 
      log.error("The Post method is not implemented by this URI") 
     } else { 
      if ((returnCode != HttpStatus.SC_OK) && (returnCode != HttpStatus.SC_MOVED_TEMPORARILY)) 
       assert false, "Bad Response Code" 
      br = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream())) 
      String readLine 
      while(((readLine = br.readLine()) != null)) { 
       log.info("Response Data = " + readLine) 
      } 
      Header [] respHeaders = method.getResponseHeaders() 
      respHeaders.each() { 
       log.info(it.getName() + " = " + it.getValue()) 
       try { 
        returnData.setProperty(it.value.split("=")[0], it.value.split("=")[1]) 
       } 
       catch (Exception exc) { 
        log.info("Could not split on equals sign = " + it.value) 
       } 
      } 
     } 
     def endTime = System.nanoTime() 
     def duration = endTime - startTime; 
     def seconds = (double)duration/1000000000.0; 
     log.info("Post took = " + seconds + " seconds (Post url = " + postData.getProperty("url") + ")") 
     return returnData 
    } catch (Exception exc) { 
     log.info(exc.message, exc) 
     return null 
    } finally { 
     method.releaseConnection() 
     if(br != null) try { 
      br.close() 
     } catch (Exception fe) { 
      log.info(fe.message, fe) 
     } 
    } 
} 
} 
0

Я использовал это, и он сам ждет работы отлично.

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 

Спасибо, попробуйте.