2016-04-27 7 views
2

abgerufen werden. Ich suche nach einer Möglichkeit, die Kontrolle über die Elemente in einem Dokument zu erhalten. Das Problem ist, dass das Dokument an einen iFrame angehängt ist.Die Elemente eines Iframes können nicht mit phantomJS

Hier ist ein Beispiel:

.goto('https://wirecard-sandbox-engine.thesolution.com/engine/hpp/')  

    .use(iframe.withFrameName('wc', function (nightmare) { 
    nightmare 
      .type('#account_number', accountNumber) 
     .screenshot(resultfolder + '\\06-Card-Number.png') 
     .type('#card_security_code', testData.securityCode) 
     .selectIndex('#expiration_month_list', 1) 
     .selectIndex('#expiration_year_list', 4) 
     .click('span[id="hpp-form-submit"]') 
})) 

Was ich versuche oben zu tun ist:

  • die iFrame mit der URL bekommen.
  • Verwenden Sie dies, um die Kontrolle über jedes Element in iFrame zu erhalten.
+0

Sind Sie sicher, dass Sie PhantomJS verwenden? Die neueste Albtraumversion verwendet Electron. –

Antwort

2

Ich stieß auf ein ähnliches Problem. Aus dem einen oder anderen Grund (Windows? Veraltet?) Funktionierte das Paket nightmare-iframe nicht für mich.

Also tat ich dies mit reinem DOM, die für Sie transkribieren würde:

var info = { 
    "account": account_number, 
    "security": testData.security_code; 
}; 

nightmare.wait(() => { 
    /* Return true when the iframe is loaded */ 
    var iframe = document.querySelector("iframe[name='wc']"); 

    if (!iframe) { 
     return false; 
    } 

    var iframeDocument = iframe.contentDocument || iframe.contentWindow.document; 

    return iframeDocument.querySelector("#account_number") != null; 
}).evaluate((info) => { 
    var iframe = document.querySelector("iframe[name='wc']"); 
    var iframeDocument = iframe.contentDocument || iframe.contentWindow.document; 

    iframeDocument.querySelector("#account_number").value = info.account; 
    iframeDocument.querySelector("#card_security_code").value = info.security; 
    //also use DOM to set proper date 
    ... 

    iframeDocument.querySelector("span#hpp-form-submit").click(); 
}, info).then(() => { 
    console.log("submit done!"); 
}).catch((error) => { 
    console.error("Error in iframe magic", error); 
}); 

Dies funktioniert nur natürlich, wenn der iframe in der gleichen Domäne wie die Haupt-Seite ist und same-origin für den iframe erlaubt. Mein Anwendungsfall war die Anmeldung bei paypal auf der Seite eines Händlers.

Für iframes mit unterschiedlichen Ursprung, nightmare-iframe wäre das Paket zu verwenden, aber dann ist ein Fehler erforderlich, um zu sehen, was das Problem ist.