2016-11-29 1 views
1

Ich habe eine Funktion erstellt, um die Zahlung nach dem Zufallsprinzip (Nummer) auszuwählen. Wenn die erste Auswahl (Nummer) nicht gefunden wird (try catch), möchte ich eine andere auswählen.Wie kann ich auf ein anderes Element klicken, wenn das Original nicht gefunden wurde?

Ich aber nehme immer:

fehlgeschlagen: Kann nicht Eigentum lesen 'klicken'

wenn Nummer 8 zu senden und es sollte Kredit Warenkorb Visum wählen ...

Was ich bin falsch machen? Die Elemente sind wirklich da und die ID ist auch richtig:

CheckoutPage3.prototype.selectPayment = function (number) { 
    if (number == 1) { 
     try { 
      this.elementPaymentPaypal.click().then(function() { 
       return 1; 
      }, function (err) { 
       console.log("payment not found, select new"); 
       this.elementPaymentCreditCard.click(); 
       this.elementCreditVISA.click(); 
       number = 2; 
      }); 
     } 
     catch (err) { 
      console.log('error occured'); 
     } 
    } 
    else if (number == 2) { 
     this.elementPaymentCreditCard.click(); 
     this.elementCreditVISA.click(); 
     number = 2; 
    } else if (number == 3) { 
     this.elementPaymentCreditCard.click(); 
     this.elementCreditMasterCard.click(); 
     number = 3; 
    } 
    else if (number == 4) { 
     try { 
      this.elementPaymentCreditCard.click(); 
      this.elementCreditAmericanExpress.click().then(function() { 
       number = 4; 
      }, function (err) { 
       console.log("payment not found, select new"); 
       this.elementCreditVISA.click(); 
       number = 2; 
      }); 
     } 
     catch (err) { 
      console.log('error occured'); 
     } 
    } 
    else { 
     try { 
      this.elementPrePayment.click().then(function() { 
       number = 5; 
      }, function (err) { 
       console.log("payment not found, select new"); 
       this.elementPaymentCreditCard.click(); 
       this.elementCreditVISA.click(); 
       number = 2; 
      }); 
     } 
     catch (err) { 
      console.log('error occured'); 
     } 
    } 
}; 

Antwort

2

Dies ist ein common problem in JavaScript, auf Ihrer Seite Objekt der this ist nicht immer etwas, das man es erwarten zu sein. Zum Beispiel hier in der Verheißung Auflösungsfunktion:

this.elementPaymentPaypal.click().then(function() { 
    return 1; 
}, function (err) { 
    console.log("payment not found, select new"); 
    this.elementPaymentCreditCard.click(); // < HERE 
    this.elementCreditVISA.click(); // < and HERE 
    number = 2; 
}); 

this bezieht sich nicht auf die Instanz des „aktuellen“ Seite Objekt mehr.

Der gemeinsame Weg, um das Problem zu nähern ist der Verweis auf this im übergeordneten Bereich zu speichern:

CheckoutPage3.prototype.selectPayment = function (number) { 
    var self = this; 

    if (number == 1) { 
     try { 
      // ... 

Und dann self anstelle von this:

this.elementPaymentPaypal.click().then(function() { 
    return 1; 
}, function (err) { 
    console.log("payment not found, select new"); 
    self.elementPaymentCreditCard.click(); 
    self.elementCreditVISA.click(); 
    number = 2; 
}); 
Verwandte Themen