2014-10-10 33 views
5

Tôi (mới) sử dụng thước đo góc để chạy thử nghiệm dưa chuột e2e. Tôi có một ứng dụng web dựa trên angularJS. Tôi đang sử dụng appium để chạy thử nghiệm từ xa trên một thiết bị Android thực sự. Dưới đây là các phiên bản tôi đang sử dụng:waitForAngular của Protractor() thất bại trên angular-webapp (appium/chrome trên thiết bị thực)

windows8.1 
[email protected] (with submodule [email protected]) 
[email protected] 
android device with 4.4.4 

cấu hình thước đo của tôi (chiết xuất), tương ứng với https://github.com/angular/protractor/blob/master/docs/browser-setup.md:

currentDeviceUDID = (...); 
var appToTestURL = 'http://my.website.com:9000/app/index.html'; 

exports.config = { 
    seleniumAddress: 'http://localhost:4723/wd/hub'; 
    chromeOnly: false, 
    specs: ['features/sample.feature'], 

    capabilities: { 
    browserName: 'chrome', 
    'appium-version': '1.0', 
    platformName: 'Android', 
    platformVersion: '4.4.4', 
    udid: currentDeviceUDID 
    }, 

    baseUrl: appToTestURL 

    framework: 'cucumber', 
    cucumberOpts: { 
    require: 'features/stepDefinitionsSample.js', 
    tags: '@dev', 
    format: 'progress' 
    }, 

    // configuring wd in onPrepare 
onPrepare: function() { 
    var wd = require('wd'), 
    protractor = require('protractor'), 
    wdBridge = require('wd-bridge')(protractor, wd); 
    wdBridge.initFromProtractor(exports.config); 
    }, 

    allScriptsTimeout: 30000, 
    getPageTimeout: 30000 
}; 

Như bạn thấy, tôi đã thay thế url webdriver của thước đo góc với appium webdriver. tôi bắt đầu appium từ dòng lệnh với "appium &", sau đó tôi chạy thử nghiệm với "protactor cucumbertest.conf"

Điện thoại mở trình duyệt chrome và điều hướng đến url tôi đưa nó bằng "browser.get (url)"

vấn đề là như sau: các waitForAngular gọi(), được đồng bộ chờ đợi cho các trang web để tải và trên tất cả các yêu cầu http mở (như xa như tôi hiểu), không được thực hiện thành công trên điện thoại. điện thoại không phản ứng với các cuộc gọi, và proxy webdriver trả về một 500.

Tương ứng với https://github.com/angular/protractor/issues/1358, tôi hiểu rằng waitForAngular() hàm được trộn lẫn trong thước đo thành các cuộc gọi

['getCurrentUrl', 'getPageSource', 'getTitle']; 

Đằng sau waitForAngular () trong protractor.js tập tin là chức năng dưới đây, được uỷ nhiệm vào điện thoại:

functions.waitForAngular = function(selector, callback) { 
    var el = document.querySelector(selector); 
    try { 
    if (angular.getTestability) { 
     angular.getTestability(el).whenStable(callback); 
    } else { 
     angular.element(el).injector().get('$browser'). 
     notifyWhenNoOutstandingRequests(callback); 
    } 
    } catch (e) { 
    callback(e); 
    } 
}; 

thông tin bổ sung: khi tôi Stim ulate lỗi trên đối tượng trình duyệt web (trình duyệt), thông báo lỗi trỏ tới chromedriver.exe bên trong thư mục thước đo góc. tôi không hiểu tại sao lỗi không phải từ chromiumriver của appium


so tldr; mà không có thành công gọi waitForAngular, tôi không thể (ổn định hoặc ở tất cả) các yếu tố truy cập trên trang trên điện thoại, do đó, không thử nghiệm. có lẽ im hiểu lầm một số chi tiết cấu hình cơ bản ở đây, tất cả các gợi ý đều được chào đón.

chỉnh sửa: thêm appium máy chủ bản ghi ở đây: http://pastebin.com/vqBGUdXH

+1

Khả năng của bạn là chính xác và máy chủ ứng dụng hoạt động chính xác. 500 trả về là sau khi tất cả các lệnh được xử lý. Hãy thử đăng bài trên discussion.appium.io bạn sẽ nhận được phản hồi tốt nhất ở đó – sheeptest

Trả lời

4

tôi giả sử tôi đã xác định được vấn đề. Appium và Protractor hoạt động tốt.

Ứng dụng angularJS của tôi gây ra sự cố. Nó sử dụng $ timeout cho polling (im buộc trên góc 1.07 mà không có khoảng $). Điều này làm cho thước đo được mong đợi trang vẫn ở trong giai đoạn tải và chưa hoàn thành. Do đó, hàm gọi waitForAngular() không bao giờ trả về và hết thời gian chờ kiểm tra sau khoảng thời gian chờ được chỉ định.

Hành vi này được mong đợi và được biết đến, cũng ghi nhận (đọc tốt hơn doc đầu tiên;)) tại http://angular.github.io/protractor/#/timeouts

Các doc gợi ý sau đây để bỏ phiếu liên tục: thay thế $timeout với $interval:

Nếu ứng dụng của bạn các cuộc thăm dò liên tục $timeout hoặc $http, nó sẽ không bao giờ được đăng ký là được tải hoàn toàn. Bạn nên sử dụng dịch vụ $interval (interval.js) cho bất kỳ thứ gì thăm dò ý kiến ​​liên tục (được giới thiệu trong Angular 1.2rc3).

Đối với bây giờ, tôi cố định vấn đề một cách khác: vô hiệu hóa được xây dựng đồng bộ góc và đồng bộ hóa

this.Before(function(next){ 
    ptor = protractor.getInstance(); 
    ptor.ignoreSynchronization = true; //disables waitForangular() 
    next(); 
}); 
  1. Sync phương pháp 1:

    //at a testcase, wait for an element to be visible with a promise/then 
    browser.wait(function() { 
        element.all(by.css('.myCssClass')).then(function (items) { 
         items[0].getText().then(function (text) { 
          console.log(text); 
         }); 
        }); 
        return true; 
    } 
    
  2. phương pháp Sync 2:

    // "eventually" (chai-as-promised) internally uses "promise" (and therefore acts like "then") 
    browser.get(url); 
    expect(browser.getTitle()).to.eventually.equal("connect me").and.notify(next); 
    
+1

tôi phải thêm ở đây là bạn có thể sử dụng $ timeout miễn là bạn chạy đúng hàm .cancel trên $ timeout. thay thế $ timeout với $ interval không phải là hiển nhiên bởi vì chúng không có hành vi chính xác. Kiểm tra bài đăng của tôi http://stackoverflow.com/questions/40832962/angular-1-5-timeout-using-a-httpinterceptor và nhận xét về cách hủy $ timeout, sau đó bạn vẫn có thể tiếp tục sử dụng waitForAngular –

Các vấn đề liên quan