2012-08-14 29 views
26

Ich habe folgende HTML:Wie ein Element in Selenium WebDriver klicken Sie JavaScript mit

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

Mein folgenden Code für Sie auf "Google-Suche", um gut funktioniert Java in WebDriver verwenden.

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

Ich möchte JavaScript mit WebDriver verwenden, um die Schaltfläche zu klicken. Wie kann ich es tun?

+0

ich nicht bekommen es - Sie wollen die '.click()' JavaScript-Funktion, dass binded abzufeuern Taste? Oder benötigen Sie etwas wie http://code.google.com/p/selenium/wiki/FrequentlyAskedQuestions#Q:_How_do_I_execute_Javascript_directly? – WTK

Antwort

67

Das Ausführen eines Klicks über JavaScript weist einige Verhaltensweisen auf, die Sie beachten sollten. Wenn beispielsweise der Code, der an das onclick -Ereignis Ihres Elements gebunden ist, window.alert() aufruft, kann es sein, dass Ihr Selenium-Code hängt, abhängig von der Implementierung des Browser-Treibers. Das heißt, Sie können die Klasse JavascriptExecutor verwenden, um dies zu tun. Meine Lösung unterscheidet sich jedoch von den anderen vorgeschlagenen, da Sie immer noch die WebDriver-Methoden zum Suchen der Elemente verwenden können.

// 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); 

Sie sollten auch beachten Sie, dass Sie besser dran sein könnte, die click() Methode der WebElement Schnittstelle, aber disabling native events vor Ihrem Fahrer Instanziierung. Dies würde das gleiche Ziel erreichen (mit denselben potenziellen Einschränkungen), aber Sie nicht zwingen, Ihr eigenes JavaScript zu schreiben und zu pflegen.

+0

Darf ich wissen warum 'Argumente [0] .click();'? Woher weißt du, dass es Index 0 ist? – huahsin68

+4

Da Sie die Elementverweis als das 0te Argument im Aufruf 'executeScript' übergeben. – JimEvans

+0

Dank dafür verbrachte nur den ganzen Vormittag auf der Suche nach einer guten Lösung und das funktioniert wie ein Charme. –

5

Hier ist der JavaScript-Code mit der Taste in WebDriver klicken:

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

Es gibt 6 Leute haben die Antwort gewählt, aber es funktioniert nicht für mich.Getting 'Dies ist keine Funktion ...' Ausnahme. Sogar kann das Skript nicht auf der Konsole ausgeführt werden, es sollte kein Semikolon nach 'click()' sein. –

+1

Das funktioniert für mich. Die Ausnahme, die ich bekommen habe, ist, weil die HTML-Seite nicht vollständig geladen wurde, habe ich mehr Zeit auf 'Thread.Sleep();' dann funktioniert es für mich. Danke –

+0

Es wird funktionieren, wenn wir "ID" als Locator haben. Was, wenn ich xpath als Locator habe? –

2

Sie können nicht WebDriver verwenden es in JavaScript zu tun, als WebDriver ein Java-Tool. Sie können jedoch JavaScript von Java mit WebDriver ausführen, und Sie könnten JavaScript-Code aufrufen, der auf eine bestimmte Schaltfläche klickt.

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

Ist es möglich, WebDriver ohne Instanziierung zu verwenden? Treiberobjekt muss als Treiber initialisiert werden = new FirefoxDriver(); Nur Deklaration ist nicht genug. –

+0

Ja, tatsächlich: Ich habe die Instanziierung (daher der Kommentar) nicht hinzugefügt, weil Sie vielleicht einen Treiber aus verschiedenen Browsern instanziieren möchten. – Stilltorik

2

Ich weiß, das nicht JavaScript ist, aber Sie können den per Mausklick auch physisch verwenden, um einen dynamischen Javascript Anker klicken:

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

war nicht Antwort sicher OP wirklich beantwortet.

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

Cross-Browser-Test Java-Scripts

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); 
    } 

} 

aber wenn Sie möchten Firefox ausführen müssen Sie Pfad deaktivieren, um Chrom, sonst Browser gestartet aber die Anwendung möglicherweise nicht. (Versuchen beide Richtungen).

+4

Warum zufällige Geräusche machen anstatt zu versuchen, die Frage zu beantworten? Ich sehe diese Art von Verhalten überall im Stackoverflow. – nurettin

+0

Dies beantwortet die Frage nicht, weil die Frage fragt, wie man es in JavaScript, nicht in Java, machen kann. – cpburnz

0

Dieser Code wird die Klick-Operation an den WebElement "wir" nach 100 ms durchführen:

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

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

Während dieses Code-Snippet die Frage lösen kann, hilft [einschließlich einer Erklärung] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) wirklich, die Qualität Ihres Posts zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, und diese Leute könnten die Gründe für Ihren Codevorschlag nicht kennen. [Von Bewertung] (https://stackoverflow.com/review/low-quality-posts/15068687) – Ferrybig

+0

Dieser Code führt die Klickoperation auf dem WebElement "wir" nach (100/1000) Sekunden durch. – hemanto

+0

Ich würde gerne wissen, warum jemand diese Antwort abwerten würde. – hemanto

Verwandte Themen