2016-10-13 5 views
1

Ich bin neu bei Selenium und ich glaube, ich verstehe einfach nicht, was im Code und im Browser passiert. Ich kann mein Problem umgehen, indem ich den Treiber (siehe unten) durch einen Treiber ersetzen. Erhalte einen Code mit der Nummer driver.sleep(1000), aber ich habe gelesen, dass Schlafanweisungen nicht ideal sind.WebdriverJS ElementNotVisibleError: Element nicht sichtbar

Kann mir jemand helfen herauszufinden, warum der Code, den ich habe, nicht funktioniert und was genau vor sich geht? Wenn es hilfreich ist, kann ich einen vollständigen Stack-Trace bereitstellen.

Hier ist, wie der Code aussieht.

const webdriver = require('selenium-webdriver') 
const chrome = require("selenium-webdriver/chrome"); 
const By = webdriver.By 
const until = webdriver.until 

var username = "XXX" 
var password = "XXX" 

function login(username, password) {  
    // This part works fine 
    driver.wait(until.elementLocated(By.id('Email'))) 
    driver.findElement(By.id('Email')).sendKeys(username) 
    driver.findElement(By.id('next')).click() 

    // Here is where the element not visible happens 
    driver.wait(until.elementLocated(By.id('Passwd')), 5000) 
    // driver.sleep(1000) works but I'm not sure why? 
    driver.findElement(By.id('Passwd')).sendKeys(password) 

    // Login 
    driver.findElement(By.id('signIn')).click() 
} 

var driver = new webdriver.Builder() 
     .withCapabilities({'browserName': 'chrome'}).build() 
driver.get('https://gmail.com') 
login(username, password) 

Update:

Per Vorschlag, habe ich versucht, die elementIsVisible Funktion zu warten, bis das Element sichtbar zu werden, über den folgenden Code.

driver.wait(until.elementIsVisible(driver.findElement(By.id('Passwd')), 5000)) 

Aber ich bekomme den folgenden Fehler.

NoSuchElementError: no such element: Unable to locate element: {"method":"css selector","selector":"*[id="Passwd"]"}

+0

'.isEnabled()' in der Regel gilt nur für 'BUTTON' Tags sind deaktiviert/aktiviert. Sie können versuchen, darauf zu warten, dass es sichtbar oder anklickbar ist. – JeffC

+0

Oh ... und noch ein Kommentar. Sie möchten, dass Funktionen nur eine einzige Sache machen ... in diesem Fall würde ich 'googeLogin()' ändern, um nur 'login()' zu sein und den Teil herausnehmen, wo Sie den Treiber einrichten und zu google navigieren. Habe es nur mit dem Login-Teil zu tun. – JeffC

+0

@JeffC Ich räumte den Code ein wenig auf. Ich habe die 'isEnabled()' Funktion entfernt, sehe aber immer noch die 'element not visible' Fehler. – jmreicha

Antwort

2

driver.wait(until.elementIsVisible(driver.findElement(By.id('Passwd')), 5000))

Eigentlich ist diese Aussage nicht richtig zu warten, bis Element sichtbar ist, in dieser Aussage driver.findElement(By.id('Passwd'))NoSuchElementError werfen würde, wenn zu diesem Zeitpunkt Elemente auf den DOM, die Sie bekommen, nicht vorhanden ist.

sollten Sie versuchen, until.elementLocated(locator) mit, die auf dem DOM bis Wunsch Element warten, zuerst, dann warten, bis Element sichtbar ist until.elementIsVisible(element) unter Verwendung: -

const until = webdriver.until; 

var pwd = driver.wait(until.elementLocated(By.id('Passwd')), 5000); 
driver.wait(until.elementIsVisible(pwd), 5000)).sendKeys(password) 
Verwandte Themen