2

selenium-webdriver (api docs here) kullanarak, bir öğenin görünür olmasını nasıl bekleyebilirsiniz?Selenyum-webdriver JS - Bir eleman görünene kadar beklemek nasıl?

Aşağıdaki işlevlere sahibim, ev yapımı test yardımcıları kümesinin bir parçası ve birincisi çalışır, ancak ikincisi başarısız olur (örneğin, varolduğundan ve görünür olmasından ötürü öğenin görünmeye zaman ayırdığı gibi) ilk html/css/js sayfasındaki tüm akredite testler ve denetimler tarafından onaylanan ve görünür olan ilk işlev tarafından onaylanmıştır.

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

    }); 
}; 

... Ben birden fazla bağlamda test, bu yüzden daha sonra waitForVisibleElement içindeki kod sorununun başka sebebi var ama neden bunu için bir sebep bulmak gibi olamaz: Burada

olduklarını çalışmıyor! Bu kod için açıklama olarak


, this bir augment yöntem belirli bir webdriver nesnesi ... muhtemelen şüpheli tasarım deseni, ancak hiçbir sebebi monkeypatches sonra webdriver instance'a (new webdriver.Builder().withCapabilities(webdriver.Capabilities.chrome()).build() sonucu) olmak biter benim Buradaki sorun :)


GÜNCELLEME: Anlaşılan bu sadece şimdi artık mantıklı değil ... { xpath: '//*[contains(text(), "first name")]' } gibi XPath locators için gerçekleşir. Ayrıca, Firefox için de aynıdır, bu yüzden garip bir krom-webdriver olayı ...

cevap

3

Büyük ihtimalle bir Promise sorunu. yerine bu deneyin:

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

Kullanımı:

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

Teşekkür! Sözümdeki kodu daha iyi yapmam için bana yardım ettin. Ama bu tek sorun değildi. Sonunda bulduğum tek çözüm, tüm xpath selektörlerini * önlemek ve xpath kullandığım durumlar için tarayıcıda * görünebilirliği * testisScript ile test etmek için özel kod eklemek oldu. sadece umutsuzluktan vazgeçmek ve hack yaptıktan sonra hack atmaktan sonra işlerin% 90'ını ... selenyum/webdriver'ın beklenen/tahmin edilebilir bir şekilde bir şey yapmasını beklemek anlamsızdır ... – NeuronQ

+0

Yardım ettiğine sevindim. XPath ile hiç bir sorunum olmadı. Bir örnek veya daha iyisi ekleyebilir misiniz, tekrarlanabilir bir örnekle yeni bir soru oluşturabilir misiniz? –

İlgili konular