2010-11-15 20 views
58

Czy istnieje sposób na wychwytywanie błędów występujących w DOM w Selenium i prawdopodobnie oznaczenie to samo, co błąd na stronie?Przechwytywanie błędu JavaScript w Selenium

Aby podać krótki przykład, powiedzmy Próbuję powiązać zdarzenie na nieistniejącej kontroli HTML, moja przeglądarka zgłasza błąd mówiąc:

element abcd not found in the console.

Teraz, jeśli chcę ten sam błąd, aby nie wykonać testu selenu, a komunikat wyświetlany w przeglądarce jest wyświetlany jako komunikat o błędzie.

Czy można zrobić coś takiego?

Odpowiedz

45

Oto informacje na temat testowania błędów js.

http://www.silverwareconsulting.com/index.cfm/2010/6/7/Checking-for-JavaScript-Errors-with-Selenium

Umieść ten skrypt na swojej stronie, a następnie sprawdzić w selen dla JSError:

<script type="text/javascript"> 
    window.onerror=function(msg){ 
     $("body").attr("JSError",msg); 
    } 
</script> 
+3

ten może być łatwo rozszerzona również złapać przypadek, w którym JQuery nie obciążenie: dodać $ ('body') attr (”. JQLoaded "," Yes ") poza wywołaniem onerror. Następnie w Selenium obecność JSError, LUB brak JQLoaded, sygnalizuje błąd JavaScript. – Nils

+32

A może po prostu powiesz "document.body.setAttribute (" JSError ", msg)' zamiast polegać na jQuery – Kos

+2

Czy musi on być dodany do strony HTML na zawsze, czy dynamicznie, gdy testy są uruchamiane? Nie jestem pewien, czy przekonałbym programistów do dodania tego fragmentu na każdej stronie. Dziękuję za udostępnienie mi szczegółów. – Michal

0

Próbujesz uwzględnić zdarzenie windows.onerror na swojej stronie lub włączyć okno dialogowe błędu wyświetlania w opcjach IE. Jeśli wybierzesz, późniejszy Se1 zawiesi się. PS: Zostało to omówione tutaj. Wykonaj wyszukiwanie.

4

JSErrorCollector spełnia swoje zadanie.

Po skonfigurowaniu, to jest kwestia:

List<JavaScriptError> jsErrorList = JavaScriptError.readErrors(driver); 
+1

FYI: ten projekt obsługuje obecnie tylko Firefox – Aligned

13

Nie wiem, kiedy to się zmieniło, ale teraz to działa na mnie w Pythonie. Plik jest prostą stroną z błędem javascript.

In [11]: driver.get("file:///tmp/a.html") 

In [12]: driver.get_log("browser") 
Out[12]: 
[{u'level': u'SEVERE', 
    u'message': u'ReferenceError: foo is not defined', 
    u'timestamp': 1450769357488, 
    u'type': u''}, 
{u'level': u'INFO', 
    u'message': u'The character encoding of the HTML document was not declared. The document will render with garbled text in some browser configurations if the document contains characters from outside the US-ASCII range. The character encoding of the page must be declared in the document or in the transfer protocol.', 
    u'timestamp': 1450769357498, 
    u'type': u''}] 

Python-Selen wersja 2.48.0 Linux Firefox 43.0

+0

Działa to również z webdriver.io. '' 'driver.log (" przeglądarka "). Then (funkcja (wyniki) { console.log (result.value); }' '' –

31

Robię to, aby uchwycić błędy JavaScript:

[TestCleanup] 
public void TestCleanup() 
{ 
    var errorStrings = new List<string> 
    { 
     "SyntaxError", 
     "EvalError", 
     "ReferenceError", 
     "RangeError", 
     "TypeError", 
     "URIError" 
    }; 

    var jsErrors = Driver.Manage().Logs.GetLog(LogType.Browser).Where(x => errorStrings.Any(e => x.Message.Contains(e))); 

    if (jsErrors.Any()) 
    { 
     Assert.Fail("JavaScript error(s):" + Environment.NewLine + jsErrors.Aggregate("", (s, entry) => s + entry.Message + Environment.NewLine)); 
    } 
} 
+2

Naprawdę podoba mi się to rozwiązanie –

+0

Używanie najnowszej wersji sterownika Selenium 3.6 .0 i Firefox 56.0, metoda "GetLog" zgłasza "Odwołanie do obiektu nie jest ustawione na instancję obiektu", nie wiem dlaczego ... To działało w starszej wersji WebDriver/Firefox –

1

Oto moje rozwiązanie inspirujące odpowiedzi jhanifen przez użytkownika:

// common.js - js file common to the entire app 
globalError = [] 
window.onerror = function (msg, url, line, col, error) { 
    globalError.push({msg:msg, url:url, line:line}) 
}; 

# tests.py 
def tearDown(driver): 
    # assert on js error 
    ret = driver.selenium.execute_script("return globalError ") 
    driver.assertFalse(ret, "errors %r " % ret) 
    # ret will be a dict looking like 
    # {'line': 50, 'url': 'http://localhost:8081/static/js/common.js', 'msg': 'Uncaught ReferenceError: s is not defined'} 
2

Chciałbym iteracyjne nad odpowiedzią jhanifen. Oto rozwiązanie javascript, które nie zależy od jQuery. Tworzy niewidoczną listę HTML na dole strony, która zawiera błędy.

(function() { 
    var ul = null; 
    function createErrorList() { 
     ul = document.createElement('ul'); 
     ul.setAttribute('id', 'js_error_list'); 
     ul.style.display = 'none'; 
     document.body.appendChild(ul); 
    } 
    window.onerror = function(msg){ 
     if (ul === null) 
      createErrorList(); 
     var li = document.createElement("li"); 
     li.appendChild(document.createTextNode(msg)); 
     ul.appendChild(li); 
    }; 
})(); 
4

Oto rozwiązanie pyton webdriver używam:

def check_browser_errors(driver): 
    """ 
    Checks browser for errors, returns a list of errors 
    :param driver: 
    :return: 
    """ 
    try: 
     browserlogs = driver.get_log('browser') 
    except (ValueError, WebDriverException) as e: 
     # Some browsers does not support getting logs 
     LOGGER.debug("Could not get browser logs for driver %s due to exception: %s", 
        driver, e) 
     return [] 

    errors = [] 
    for entry in browserlogs: 
     if entry['level'] == 'SEVERE': 
      errors.append(entry) 
    return errors 
Powiązane problemy