2012-08-14 17 views
26

Mam następujące HTML:Jak kliknij element w selen WebDriver użyciu JavaScript

<button name="btnG" class="gbqfb" aria-label="Google Search" id="gbqfb"><span class="gbqfi"></span></button> 

Moje następujący kod klikając przycisk „Szukaj w Google” pracuje dobrze przy użyciu języka Java w WebDriver.

driver.findElement(By.id("gbqfb")).click(); 

Chcę użyć JavaScript z WebDriver, aby kliknąć przycisk. Jak mogę to zrobić?

+0

ja nie rozumiem - chcesz '.Kliknij()' ognia funkcji javascript binded do przycisk? A może potrzebujesz czegoś takiego jak http://code.google.com/p/selenium/wiki/FrequentlyAskedQuestions#Q:_How_do_I_execute_Javascript_directly? – WTK

Odpowiedz

67

Wykonanie kliknięcia za pomocą JavaScriptu ma pewne zachowania, o których powinieneś wiedzieć. Jeśli na przykład kod powiązany z zdarzeniem onclick wywoła kod window.alert(), kod Selenium może się zawiesić, w zależności od implementacji sterownika przeglądarki. Mimo to możesz użyć klasy JavascriptExecutor, aby to zrobić. Moje rozwiązanie różni się od innych proponowanych, jednak, że nadal można używać metod WebDriver do lokalizowania elementów.

// Assume driver is a valid WebDriver instance that 
// has been properly instantiated elsewhere. 
WebElement element = driver.findElement(By.id("gbqfd")); 
JavascriptExecutor executor = (JavascriptExecutor)driver; 
executor.executeScript("arguments[0].click();", element); 

Należy również pamiętać, że może być lepiej przy użyciu metody interfejsu WebElementclick(), ale disabling native events przed instancji sterownika. Osiągnęłoby to ten sam cel (z tymi samymi potencjalnymi ograniczeniami), ale nie zmuszało do pisania i utrzymywania własnego kodu JavaScript.

+0

Czy mogę wiedzieć, dlaczego 'arguments [0] .click();'? Skąd wiesz, że jest to indeks 0? – huahsin68

+4

Ponieważ przekazujesz odwołanie do elementu jako 0. argument w wywołaniu 'executeScript'. – JimEvans

+0

Dziękuję za to, spędziłem cały ranek szukając dobrego rozwiązania i działa to jak czar. –

5

Oto kod przy użyciu JavaScript, aby kliknąć przycisk w WebDriver:

WebDriver driver = new FirefoxDriver(); 
JavascriptExecutor jse = (JavascriptExecutor)driver; 
jse.executeScript("document.getElementById('gbqfb').click();"); 
+0

Odpowiedzi udzieliło 6 osób, ale to nie działa dla mnie.Uzyszanie 'To nie jest funkcja ...' wyjątek. Nawet nie można wykonać skryptu na konsoli, nie powinno być średnika po 'click()'. –

+1

To działa dla mnie. Tam dostałem wyjątek, ponieważ strona HTML nie była całkowicie załadowana, dlatego poświęcam więcej czasu na 'Thread.Sleep() ;, wtedy jej działa dla mnie. Dzięki –

+0

Będzie działać, gdy mamy" id "jako lokalizator. Co się stanie, jeśli mam xpath jako lokalizator? –

2

Nie można używać WebDriver to zrobić w JavaScript, a WebDriver to narzędzie Java. Możesz jednak wykonywać JavaScript z poziomu Java za pomocą WebDriver, możesz też wywołać kod JavaScript, który kliknie określony przycisk.

WebDriver driver; // Assigned elsewhere 
JavascriptExecutor js = (JavascriptExecutor) driver; 
js.executeScript("window.document.getElementById('gbqfb').click()"); 
+0

Czy można używać WebDriver bez tworzenia instancji? obiekt sterownika musi zostać zainicjowany jako driver = new FirefoxDriver(); Tylko deklaracja to za mało. –

+0

Tak, rzeczywiście: zdecydowałem się nie dodawać instancji (stąd komentarz), ponieważ może być konieczne utworzenie sterownika z różnych przeglądarek. – Stilltorik

2

wiem, że to nie jest JavaScript, ale można również fizycznie użyć myszy kliknij, aby kliknąć dynamiczny kotwicę javascript:

public static void mouseClickByLocator(String cssLocator) { 
    String locator = cssLocator; 
    WebElement el = driver.findElement(By.cssSelector(locator)); 
    Actions builder = new Actions(driver); 
    builder.moveToElement(el).click(el); 
    builder.perform(); 
} 
1

Nie wiesz OP odpowiedź była naprawdę odpowiedział.

var driver = new webdriver.Builder().usingServer('serverAddress').withCapabilities({'browserName': 'firefox'}).build(); 

driver.get('http://www.google.com'); 
driver.findElement(webdriver.By.id('gbqfb')).click(); 
-10

Krzyż skrypty java testowania przeglądarka

public class MultipleBrowser { 

    public WebDriver driver= null; 
    String browser="mozilla"; 
    String url="https://www.omnicard.com"; 

    @BeforeMethod 
    public void LaunchBrowser() { 

     if(browser.equalsIgnoreCase("mozilla")) 
      driver= new FirefoxDriver(); 
     else if(browser.equalsIgnoreCase("safari")) 
      driver= new SafariDriver(); 
     else if(browser.equalsIgnoreCase("chrome")) 
      //System.setProperty("webdriver.chrome.driver","/Users/mhossain/Desktop/chromedriver"); 
      driver= new ChromeDriver(); 
     driver.manage().timeouts().implicitlyWait(4, TimeUnit.SECONDS); 
     driver.navigate().to(url); 
    } 

} 

ale gdy chcesz uruchomić Firefoksa trzeba chrom Wyłącz ścieżki, w przeciwnym razie przeglądarka uruchomi ale aplikacja nie może. (Spróbuj zarówno sposób).

+4

Po co generować losowy szum zamiast próbować odpowiedzieć na pytanie? Widzę takie zachowanie wszędzie na stackoverflow. – nurettin

+0

To nie odpowiada na pytanie, ponieważ pytanie pyta, jak to zrobić z poziomu JavaScript, a nie Java. – cpburnz

0

Kod ten będzie wykonać operację kliknij na WebElement „my” po 100 ms:

WebDriver driver = new FirefoxDriver(); 
JavascriptExecutor jse = (JavascriptExecutor)driver; 

jse.executeScript("var elem=arguments[0]; setTimeout(function() {elem.click();}, 100)", we); 
+1

Chociaż ten fragment kodu może rozwiązać pytanie, [w tym wyjaśnienie] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-ans -answers) naprawdę pomaga poprawić jakość twojego posta. Pamiętaj, że odpowiadasz na pytanie przeznaczone dla czytelników w przyszłości, a te osoby mogą nie znać powodów sugestii dotyczących kodu. [Z recenzji] (https://stackoverflow.com/review/low-quality-posts/15068687) – Ferrybig

+0

Ten kod wykona operację kliknięcia w WebElement "we" po (100/1000) sekundach. – hemanto

+0

Chciałbym wiedzieć, dlaczego ktoś mógłby zgodzić się z tą odpowiedzią. – hemanto

Powiązane problemy