2

Wie kann man mit selenium-webdriver (api docs here) darauf warten, dass ein Element sichtbar ist?Selen-webdriver JS - wie man wartet bis ein Element sichtbar ist

Ich habe die folgenden Funktionen, Teil einer hausgemachten Reihe von Testhelfern, und die erste funktioniert, aber die zweite fehlschlägt (z. B. Zeitüberschreitung für und Element zu sehen, auch wenn es existiert - als bestätigt durch die erste funktion, die funktioniert - und ist sichtbar - wie durch alle erdenklichen tests und inspektionen der seite html/css/js bestätigt).

Hier sind sie:

/** 
* Wait for an element to exist 
* 
* @param {object} locator 
* @param {int} timeout (ms) 
* 
* @return {Promise<element>} 
*/ 
// !! THIS WORKS OK 
exports.waitForElement = function (locator, timeout) { 
    var waitTimeout = timeout || DEFAULT_TIMEOUT; 

    return this.wait(until.elementLocated(locator), waitTimeout) 
    .then(() => { 

     return this.findElement(locator); 
     }); 
}; 


/** 
* Wait for an element to exist and then wait for it to be visible 
* 
* IMPORTANT: this is probable what you want to use instead of 
* waitForVisibleElement most of the time. 
* 
* @param {hash} locator 
* @param {number} timeout 
* 
* @return {Promise<element>} 
*/ 
// !! THIS FAILS TO WORK AS EXPECTED 
exports.waitForVisibleElement = function (locator, timeout) { 
    var waitTimeout = timeout || DEFAULT_TIMEOUT; 

    return this.waitForElement(locator, waitTimeout) 
    .then(el => { 
     console.log('--- element found:', el); 
     return this.wait(until.elementIsVisible(el), waitTimeout) 

     .then(() => { 
      console.log('--- element visible!'); 
      // this is to make sure we are returning the same kind of 
      // promise as waitForElement 
      return this.findElement(locator); 
     }); 

    }); 
}; 

... ich in mehreren Kontexten getestet, so ist es keine andere Ursache des Problems dann der Code innerhalb waitForVisibleElement aber ich kann keinen Grund zu finden scheinen, warum es funktioniert nicht!


Zur Erläuterung this für diesen Code endet die WebDriver Instanz zu sein (das Ergebnis der new webdriver.Builder().withCapabilities(webdriver.Capabilities.chrome()).build()) nach einem augment Verfahren ein gegebenes WebDriver Objekt monkeypatches ... wahrscheinlich ein fragwürdiges Design-Muster, aber nicht die Ursache für meine hier Problem :)


UPDATE: Offenbar nur dies geschieht für XPath, wie { xpath: '//*[contains(text(), "first name")]' } ... nicht, dass es jetzt mehr Sinn macht. Es ist auch das gleiche für Firefox, also ist es kein komisches Chrom-webdriver Ding ...

Antwort

3

Es ist höchstwahrscheinlich ein Promise-Problem. Versuchen Sie stattdessen:

exports.waitForElement = function (locator, timeout) { 
    var timeout = timeout || DEFAULT_TIMEOUT; 
    return this.wait(until.elementLocated(locator), timeout); 
}; 

exports.waitForVisibleElement = function (locator, timeout) { 
    var timeout = timeout || DEFAULT_TIMEOUT; 
    var element = this.wait(until.elementLocated(locator), timeout); 
    return this.wait(new until.WebElementCondition('for element to be visible ' + locator, function() { 
    return element.isDisplayed().then(v => v ? element : null); 
    }), timeout); 
}; 

Verbrauch:

driver.get("..."); 

driver.waitForElement(By.id("..."), 2000).getText().then(function(text){ 
    console.log(text); 
}); 

driver.waitForVisibleElement(By.id("..."), 2000).getText().then(function(text){ 
    console.log(text); 
}); 
+0

Dank! Sie haben mir geholfen, meinen Versprechenscode besser zu strukturieren. Aber das war nicht das einzige Problem. Am Ende war die einzige Problemumgehung, die ich fand, * alle xpath Selektoren * zu vermeiden und speziellen Code hinzuzufügen, der nach Sichtbarkeit * innerhalb des Browsers sucht * mit 'executeScript' für die Fälle, in denen ich xpath für ... wahrscheinlich die beste Idee verwendet habe Es ist einfach, alle Hoffnung aufzugeben und einen Hack nach dem anderen zu werfen, bis die Dinge> 90% der Zeit funktionieren ... Selen/Webdriver zu erwarten, dass alles in einer erwartbaren/vorhersagbaren Weise ist sinnlos ... – NeuronQ

+0

Ich bin froh, dass es geholfen hat. Obwohl ich nie Probleme mit XPath hatte. Könnten Sie ein Beispiel hinzufügen oder besser, erstellen Sie eine neue Frage mit einem reproduzierbaren Beispiel? –

Verwandte Themen