2013-04-26 23 views
15

Używam Selenium Webdriver w Javie. Chcę uzyskać bieżący URL po kliknięciu przycisku „Dalej”, aby przejść od strony 1 do strony 2. Oto kod mam:selen uzyskać aktualny adres URL po załadowaniu strony

WebDriver driver = new FirefoxDriver(); 
    String startURL = //a starting url; 
    String currentURL = null; 
    WebDriverWait wait = new WebDriverWait(driver, 10); 

    foo(driver,startURL); 

    /* go to next page */ 
    if(driver.findElement(By.xpath("//*[@id='someID']")).isDisplayed()){ 
     driver.findElement(By.xpath("//*[@id='someID']")).click(); 
     driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 
     wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id='someID']"))); 
     currentURL = driver.getCurrentUrl(); 
     System.out.println(currentURL); 
    } 

mam zarówno niejawne i jawne czekać wzywa czekać na stronie być w pełni załadowanym, zanim otrzymam aktualny adres URL. Nadal jednak drukuje adres URL strony 1 (oczekuje się, że będzie to adres URL strony 2).

+0

BTW, Docs (teraz?) Twierdzi, nie mieszać ukryte/jawnych czeka ze względu na to czyni czas oczekiwania nieprzewidywalne. Odpowiednia wycena: _OSTRZEŻENIE: Nie mieszaj ukrytych i jednoznacznych oczekiwań. Może to spowodować nieprzewidywalne czasy oczekiwania. Na przykład ustawienie domyślnego czasu oczekiwania wynoszącego 10 sekund i jednoznaczne oczekiwanie wynoszące 15 sekund może spowodować przekroczenie limitu czasu po 20 sekundach. Od: http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp#implicit-waits – mbafford

Odpowiedz

17

Tak jak powiedziałeś, ponieważ ścieżka xpath następnego przycisku jest taka sama na każdej stronie to nie zadziała. Działa jak zakodowana, ponieważ oczekuje na wyświetlanie elementu, ale ponieważ jest już wyświetlana, nie ma zastosowania domyślne oczekiwanie, ponieważ nie musi w ogóle czekać. Dlaczego nie używasz tego, że URL zmienia się, ponieważ z twojego kodu wydaje się zmieniać po kliknięciu następnego przycisku. Robię C# ale myślę, że w Javie byłoby coś takiego:

WebDriver driver = new FirefoxDriver(); 
String startURL = //a starting url; 
String currentURL = null; 
WebDriverWait wait = new WebDriverWait(driver, 10); 

foo(driver,startURL); 

/* go to next page */ 
if(driver.findElement(By.xpath("//*[@id='someID']")).isDisplayed()){ 
    String previousURL = driver.getCurrentUrl(); 
    driver.findElement(By.xpath("//*[@id='someID']")).click(); 
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 

    ExpectedCondition e = new ExpectedCondition<Boolean>() { 
      public Boolean apply(WebDriver d) { 
      return (d.getCurrentUrl() != previousURL); 
      } 
     }; 

    wait.until(e); 
    currentURL = driver.getCurrentUrl(); 
    System.out.println(currentURL); 
} 
+0

Próbowałem tego, ale pojawił się błąd i powiedziałem, że muszę zrobić finał currentURL. ale nie będę w stanie go zaktualizować – pew007

+0

Nie jestem programistą Java, więc nie jestem pewien składni. Błąd, który otrzymujesz, brzmi: może to być jedna z dwóch rzeczy: albo musisz przekazać currentURL w oczekiwany sposób, nie wiem, jak to zrobić, albo potrzebujesz innej zmiennej do przechowywania adresu URL, ponieważ zmień to później. Zaktualizowałem swoją odpowiedź na ostatnie podejście, czy możesz spróbować? – ragamufin

+0

Możesz także spróbować zadeklarować 'previousURL' jako ostateczny – ragamufin

0

Minęło trochę czasu odkąd zakodowałem selenem, ale twój kod wygląda dla mnie dobrze. Należy pamiętać, że jeśli element nie zostanie znaleziony, ale upłynął limit czasu, myślę, że kod będzie nadal wykonywany. Możesz zrobić coś takiego:

boolean exists = driver.findElements(By.xpath("//*[@id='someID']")).size() != 0 

Co oznacza powyższa wartość logiczna? Czy jesteś pewien, że selen faktycznie przechodzi na oczekiwaną stronę? (To może brzmieć jak głupie pytanie, ale czy faktycznie oglądasz zmiany stron ... selen może być uruchamiany zdalnie, wiesz ...)

+0

Tak, selen faktycznie przechodzi do następnej strony, ponieważ ją oglądałem. I myślę, że zrozumiałem, dlaczego to nie zadziałało. Dzieje się tak dlatego, że ścieżka x, którą przekazałem, jest ścieżką xpath dla przycisku "następny", który znajduje się na każdej stronie. Więc nie mogę tego użyć, aby powstrzymać sterownik od czekania na załadowanie następnej strony ... jeśli to ma sens dla ciebie. Jednak nie rozumiem, dlaczego niejawne połączenie nie zadziała. Czy istnieje jakakolwiek inna metoda? – pew007

1

Strona 2 znajduje się w nowej karcie/oknie? Jeśli to ten, użyj kodu poniżej:

try { 

    String winHandleBefore = driver.getWindowHandle(); 

    for(String winHandle : driver.getWindowHandles()){ 
     driver.switchTo().window(winHandle); 
     String act = driver.getCurrentUrl(); 
    } 
    }catch(Exception e){ 
    System.out.println("fail"); 
    }