J'essaye de localiser une iframe par id partiel. Pour cette méthode, j'ai utilisé:
driver.switchTo (). frame (driver.findElement (By.cssSelector ("iframe [id * = 'card-fields-number']")));
J'ai aussi essayé xpath.
<iframe srcdoc="<script>!function(){var e=function(e){var t={exports:{}};return e.call(t.exports,t,t.exports),t.exports},t=function(){function e(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(t,n,i){return n&&e(t.prototype,n),i&&e(t,i),t}}(),n=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},i=function(e){return e&&e.__esModule?e:{"default":e}},o=e(function(e,i){"use strict";Object.defineProperty(i,"__esModule",{value:!0});var o=function(){function e(){var t=this;n(this,e),this.calls=[],window.ga=function(){for(var e=arguments.length,n=Array(e),i=0;i<e;i++)n[i]=arguments[i];return t.gaCall(n)}}return t(e,[{key:"gaCall",value:function(e){var t=this;this.calls.push(e),clearTimeout(this.timeout),this.timeout=setTimeout(function(){t.calls.length>0&&t.sendMessage()},0)}},{key:"listen",value:function(){var e=this;window.addEventListener("message",function(t){return e.receiveMessage(t)},!1)}},{key:"sendMessage",value:function(){window.parent.postMessage({type:"analytics",calls:this.calls},this.origin),this.calls=[]}},{key:"receiveMessage",value:function(e){if(e.source===window.parent&&"checkout_context"===e.data.type){this.origin=e.origin,window.Shopify=e.data.Shopify,window.__st=e.data.__st;try{window.additionalScripts()}catch(e){console.error("User script error: ",e)}}}}]),e}();i["default"]=o});e(function(){"use strict";var e=i(o);!function(){(new e["default"]).listen()}()})}("undefined"!=typeof global?global:"undefined"!=typeof window&&window); window.additionalScripts = function () {};</script>" src="https://checkout.shopify.com/2192362/sandbox/google_analytics_iframe" onload="this.setAttribute('data-loaded', true)" sandbox="allow-scripts" id="google-analytics-sandbox" tabindex="-1" class="visually-hidden" style="display:none" aria-hidden="true" data-loaded="true"></iframe>
Cependant, je reçois toujours cette exception:
org.openqa.selenium.NoSuchElementException: Le nœud renvoyé (null) n'était pas un élément DOM code >
J'ai découvert que lorsque j'active javascript pour HtmlUnit, il est capable de localiser le cadre et d'y basculer. Je préférerais ne pas activer javascript car il est très lent pour moi et ajoute un retard inutile.
Code HTML iFrame:
<iframe class="card-fields-iframe" frameborder="0" id="card-fields-number-7pbvqg7azsf00000" name="card-fields-number-7pbvqg7azsf00000" scrolling="no" src="https://checkout.shopifycs.com/number?identifier=438599641d0ed8fe61c161d72e62b5f8&location=https%3A%2F%2Fshopnicekicks.com%2F2192362%2Fcheckouts%2F438599641d0ed8fe61c161d72e62b5f8&dir=ltr&fonts[]=Lato" title="Field container for: Card number" style="height: 43px;"></iframe>
L'ID iFrame est dynamique, c'est pourquoi je recourt à l'utilisation d'un ID partiel.
Site Web lien: https://shopnicekicks.com/checkout Vous devez tout remplir jusqu'à ce que vous atteigniez la dernière page, qui est la page d'informations sur la carte de crédit.
Mettre à jour L'iFrame se trouve à l'intérieur du cadre parent. Cadre parent:
driver.switchTo().frame(driver.findElement(By.xpath("//iframe[contains(@id,'card-fields-number')]")));
3 Réponses :
Essayez simplement avec l'indexation d'images "// iframe [index]", où index integer.
par exemple xpath: // iframe [1]
L'identifiant de trame peut changer dynamiquement, mais dans quelques applications, la structure reste la même, donc l'indexation résout le problème.
Veuillez me faire savoir si cela résout le problème.
Il trouve une iframe, mais ne parvient pas à identifier les éléments à l'intérieur.
Alors le seul moyen est de trouver le nombre d'images présentes comme indiqué par sameer arora. s'il s'agit d'un site Web de pratique que vous automatisez ou d'un site Web accessible au public, veuillez partager le lien.
Il y a environ 5 cadres. Cependant, il ne peut localiser que iframe [1]. Les autres cadres impriment org.openqa.selenium.NoSuchFrameException: Impossible de localiser un nœud en utilisant // iframe [numéro]
Comme l'iframe a la balise iframe
, vous pouvez passer à l'iframe en utilisant le tagname comme:
driver.switchTo (). frame (driver.findElement (By.tagName ("iframe")));
Et si vous voulez revenir au contenu par défaut, vous pouvez utiliser driver.switchTo().defaultContent();
Il bascule vers un iframe, puis ne parvient pas à localiser un élément à l'intérieur de l'iframe. Cela peut être dû au fait qu'il existe plusieurs iframes.
Ok, vous devez donc savoir combien de cadres il y a, puis vous devez passer aux cadres un par un, puis vous devez opérer sur l'élément.
Ce message d'erreur ...
new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("//iframe[@class='card-fields-iframe' and starts-with(@id,'card-fields-number-')][contains(@src, 'shopifycs')]")));
... implique qu'il n'y avait aucun élément de ce type trouvé car le nœud renvoyé était nul strong > ou n'était pas un élément DOM.
Il s'agit toujours d'un ouvert problème avec l'équipe htmlunit-driver .
Cependant, il y a certaines choses dont vous devez faire attention comme suit:
.
est en jeu, l'attribut src
de la balise
joue un rôle vital rôle.
, vous devez induire WebDriverWait pour que le cadre souhaité soit disponible et y basculer.
Vous pouvez donc utiliser l'une des solutions suivantes:
cssSelector :
new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.cssSelector("iframe.card-fields-iframe[id^='card-fields-number-'][src*='shopifycs']")));
xpath :
org.openqa.selenium.NoSuchElementException: Returned node (null) was not a DOM element
Voir l'instantané du CssSelector
qui identifie l'élément perfecto selon le HTML que vous avez fourni:
CssSelector et xpath renvoient cette exception. org.openqa.selenium.TimeoutException: échec de la condition attendue: attente de la disponibilité du cadre:
@Jeff Consultez la mise à jour de ma réponse et faites-moi savoir ce que vous en pensez.
Merci d'avoir répondu. Cependant, vous avez dit que javascript doit être activé, mais je me demandais s'il y avait un moyen de le faire sans activer javascript. Cela fonctionne parfaitement comme vous l'avez dit lorsqu'il est activé.
@Jeff J'ai déjà fourni le lien vers la discussion relative à propos de HtmlUnitDriver ne charge pas de javascript lors de la navigation dans une page à partir d'une URL