2
votes

org.openqa.selenium.NoSuchElementException: Le nœud renvoyé (null) n'était pas un élément DOM lors de la tentative de localisation de card-fields-iframe par CssSelector

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,&quot;value&quot;in i&amp;&amp;(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(t,n,i){return n&amp;&amp;e(t.prototype,n),i&amp;&amp;e(t,i),t}}(),n=function(e,t){if(!(e instanceof t))throw new TypeError(&quot;Cannot call a class as a function&quot;)},i=function(e){return e&amp;&amp;e.__esModule?e:{&quot;default&quot;:e}},o=e(function(e,i){&quot;use strict&quot;;Object.defineProperty(i,&quot;__esModule&quot;,{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:&quot;gaCall&quot;,value:function(e){var t=this;this.calls.push(e),clearTimeout(this.timeout),this.timeout=setTimeout(function(){t.calls.length>0&amp;&amp;t.sendMessage()},0)}},{key:&quot;listen&quot;,value:function(){var e=this;window.addEventListener(&quot;message&quot;,function(t){return e.receiveMessage(t)},!1)}},{key:&quot;sendMessage&quot;,value:function(){window.parent.postMessage({type:&quot;analytics&quot;,calls:this.calls},this.origin),this.calls=[]}},{key:&quot;receiveMessage&quot;,value:function(e){if(e.source===window.parent&amp;&amp;&quot;checkout_context&quot;===e.data.type){this.origin=e.origin,window.Shopify=e.data.Shopify,window.__st=e.data.__st;try{window.additionalScripts()}catch(e){console.error(&quot;User script error: &quot;,e)}}}}]),e}();i[&quot;default&quot;]=o});e(function(){&quot;use strict&quot;;var e=i(o);!function(){(new e[&quot;default&quot;]).listen()}()})}(&quot;undefined&quot;!=typeof global?global:&quot;undefined&quot;!=typeof window&amp;&amp;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&amp;location=https%3A%2F%2Fshopnicekicks.com%2F2192362%2Fcheckouts%2F438599641d0ed8fe61c161d72e62b5f8&amp;dir=ltr&amp;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')]")));


0 commentaires

3 Réponses :


1
votes

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.


3 commentaires

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]



1
votes

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();


2 commentaires

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.



1
votes

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:

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
    

Update

Voir l'instantané du CssSelector qui identifie l'élément perfecto selon le HTML que vous avez fourni:

 CssSelector


4 commentaires

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