Protractor: getText() ne fonctionne pas sur le sous-élément - balise p, renvoie une chaîne vide

Créé le 9 févr. 2015  ·  25Commentaires  ·  Source: angular/protractor

Salut,
J'ai le bloc ci-dessous dans mon ng-repeat

 <div ng-repeat="node in nodes">
     <div class="class1">
            <div class="class2">
                  <span class="cls-icon"></span>
                  <p>Text1</p>
            </div>
   </div>
</div>
 <div ng-repeat="node in nodes">
     <div class="class1">
            <div class="class2">
                  <span class="cls-icon"></span>
                  <p>Text2</p>
            </div>
   </div>
</div>
.....

Étant donné que le seul texte à l'intérieur de chaque bloc répété existe dans la balise p, j'utilise comme ci-dessous,

element(by.repeater('node in nodes').row(0)).getText().then(function(text) {
    expect(text).toBe('Text1');
});

Mais cela renvoie toujours une chaîne vide ''.

WebDriver issufeature needs investigation

Commentaire le plus utile

J'ai eu une chaîne vide provenant de la promesse getText() renvoyée, ni d'un input ni d'un textarea
Voici un extrait de mon HTML :

<li data-ng-repeat="emitter in account.identifier.emitters" data-ng-if="emitter._id != account.emitter._id">
    <a href="" data-ng-click="switchToEmitter(emitter)" data-ng-bind="emitter.name"></a>
</li>

Alors que cela a donné une chaîne vide:

element(by.css('li[data-ng-repeat="emitter in account.identifier.emitters"] a')).getText()

ça a fait l'affaire :

element(by.css('li[data-ng-repeat="emitter in account.identifier.emitters"] a')).getAttribute('innerText')

Tous les 25 commentaires

Salut,

Si vous pouviez passer par le lien FAQ : http://angular.github.io/protractor/#/faq , vous pouvez constater que 'getText()' renvoie une chaîne vide. utilisez donc "element.getAttribute('value')"

Fermeture puisque c'est une question de réponse. Merci @sallojusuresh !

Pourquoi avez-vous fermé ce sujet ? Le problème n'est pas avec input ou textarea , c'est avec getText() de p dans un répéteur ng. Comment puis-je utiliser getAttribute('value') lorsqu'il y a une valeur liée à l'un des éléments ?

Essayez ci-dessous :

element(by.repeater('nœud dans les nœuds').row(0)).getAttribute('value').then(function(text) {
attendre(texte).toBe('Text1');
});

OU

element(by.tagName('p')).getAttribute('value').then(function(text) {
attendre(texte).toBe('Text1');
});

@KamalakannanPE exécutez -vous vos tests dans PhantomJS ? Si c'est le cas, utiliser getInnerHtml() au lieu de getText() a résolu notre problème (voir #1229).

@juliemr @sallojusuresh utiliser getAttribute('value') n'aide en fait pas, car l'exemple n'utilise pas d'élément input . @KamalakannanPE a essayé d'expliquer que getText() devrait renvoyer l'innerHTML de l'élément p . Donc, je ne considérerais pas non plus ce problème comme clos, mais # 1229 semble être le meilleur endroit pour travailler sur ce problème.

@gesellix Non. J'ai essayé dans le navigateur Chrome uniquement. pas dans PhantomJS.

@KamalakannanPE alors, pourriez-vous essayer si l'utilisation getInnerHtml() résout le problème pour votre configuration ? Ce serait un aspect intéressant à ajouter à l'autre numéro #1229 .

getInnerHtml() retourne

<div class="class1">
            <div class="class2">
                  <span class="cls-icon"></span>
                  <p>Text2</p>
            </div>
   </div>

mais je veux seulement "Text2".

@KamalakannanPE ah, c'est vrai, j'ai oublié les différentes sémantiques :)

@juliemr Je ne sais pas si ce problème et # 1229 doivent être combinés.
Nous avons essayé d'autres endroits avec le même code et parfois getText() fonctionne, parfois non. De quoi auriez-vous besoin de nous pour enquêter ?

Il y a certainement un problème ici...

J'ai exécuté un test sur un tableau d'éléments <p> contenant des balises <em> , et une fois sur 5, la méthode .getText() ignore le texte contenu dans le <em> balises.

Par exemple:

[
  "<em>Beer</em> Production Up 17.9% To 18.5 Million Decaliters In April",
  "Anheuser-Busch temporarily halts <em>beer</em> production to help Texas, Oklahoma flood victims",
  "Texas floods: Budweiser brewery to can water instead of <em>beer</em> to help flood victims",
  "KC allows tiny breweries in neighborhoods, liquor and <em>beer</em> sales in City Market",
  "<em>Beer</em> news: Funky Buddha to open restaurant inside brewery"
]

Le texte est bien extrait pour toutes ces chaînes sauf pour la 4ème, où j'ai obtenu : KC allows tiny breweries in neighborhoods, liquor and sales in City Market

EDIT : J'utilise du sélénium.

Est-il possible de rouvrir ce problème ? La première réponse donnée ne s'applique pas ici, et l'utilisation innerHTML ne fait pas le travail lorsqu'il faut comparer des textes, indépendamment des balises supplémentaires.

J'ai le même problème et je dois supprimer manuellement les balises HTML et transformer les entités HTML en leur valeur de texte pour que mes tests réussissent. L'implémentation actuelle de getText ne fonctionne pas de manière cohérente comme décrit dans la documentation :

Récupère le texte intérieur visible (c'est-à-dire non masqué par CSS) de cet élément, y compris les sous-éléments, sans aucun espace de début ou de fin.

J'ai eu une chaîne vide provenant de la promesse getText() renvoyée, ni d'un input ni d'un textarea
Voici un extrait de mon HTML :

<li data-ng-repeat="emitter in account.identifier.emitters" data-ng-if="emitter._id != account.emitter._id">
    <a href="" data-ng-click="switchToEmitter(emitter)" data-ng-bind="emitter.name"></a>
</li>

Alors que cela a donné une chaîne vide:

element(by.css('li[data-ng-repeat="emitter in account.identifier.emitters"] a')).getText()

ça a fait l'affaire :

element(by.css('li[data-ng-repeat="emitter in account.identifier.emitters"] a')).getAttribute('innerText')

J'ai essayé le code initial et je ne peux pas reproduire ce problème. (https://github.com/juliemr/protractor/commit/4ecfad8329d83ae3de07f07e348b801ac59cdbca)

Les commentaires supplémentaires ici ne me suffisent pas pour essayer de reproduire. @blarsy J'ai essayé d'exécuter avec ng-bind au lieu d'utiliser l'interpolation et je n'ai pas pu reproduire le problème.

J'ai essayé avec Chrome et Firefox.

Je ferme ceci car incapable de reproduire. Veuillez ouvrir un nouveau problème si vous trouvez un moyen fiable de le faire et pensez qu'il y a toujours un problème avec le rapporteur ou le sélénium (et si c'est avec le sélénium, veuillez ouvrir un problème sur leur référentiel !)

J'ai un problème similaire où nos tests de rapporteur échouent parfois où getText a renvoyé une chaîne vide. Cela échoue assez souvent sur notre CI et cela passera souvent si vous l'exécutez à nouveau.

Parfois, c'est juste l'un d'entre eux dans le tableau, parfois c'est 2 ou 3 d'entre eux, mais jamais tous et il obtient le bon nombre d'éléments.

Nous utilisons ui-select et nous devons cliquer dessus pour nous assurer qu'il est visible en premier. J'ai presque l'impression que la promesse se résout avant de pouvoir obtenir le texte des deux premiers éléments, même si j'ai essayé un browser.sleep après le click et cela n'a pas aidé.

Pourriez-vous rouvrir ceci ou devrais-je créer un nouveau problème car il s'agit d'un échec occasionnel ?

11:32:03.856 [chrome #1-33]   1) when I navigate to room types it should display the bed configuration in the correct order
11:32:03.856 [chrome #1-33]    Message:
11:32:03.856 [chrome #1-33]      Expected [ '', 'Double', 'Twin', 'Double or Twin' ] to equal [ 'Single', 'Double', 'Twin', 'Double or Twin' ].
// EditPage
    self.getConfigurations = function () {
        finder.element(by.css('[ng-model="vm.roomType.configuration"]')).click();
        return finder.all(by.id('ui-select-choices-1')).get(0).all(by.css('.ui-select-choices-row')).getText();
    };

//....

    it('it should display the bed configuration in the correct order', function () {
        var editPage = listPage.createRoomType();

        expect(editPage.getConfigurations()).toEqual(['Single', 'Double', 'Twin', 'Double or Twin']);
    });

@jamlen , veuillez ouvrir un nouveau problème avec un test reproductible que nous pouvons exécuter (et une sorte d'indication de la fréquence à laquelle vous voyez l'échec).

J'ai exactement le même problème ici. Utilisation de phantonjs 1.9.19. J'essaie d'extraire le texte d'un élément th et une chaîne vide est renvoyée. utiliser getInnerHtml au lieu de getText fonctionne bien dans cette situation.

@jamlen si vous créez un nouveau problème, veuillez le lier ici.

Une cause possible à cela est une erreur de l'opérateur, une mauvaise utilisation de Promises. Par exemple,

    .then( () => {
        AnElement.getText();
    })
    .then( function (foundText) {
        expect( foundText ).to.equal( expectText );
    });

Sans un return dans la première clause, le test échouera toujours.

Pourquoi getText() renvoie-t-il une chaîne vide alors que getAttribute('textContent') renvoie le texte attendu ? J'ai l'impression que je ne peux pas faire confiance à getText et que je dois utiliser getAttribute tout le temps maintenant.

Ne fonctionne pas pour moi non plus. J'essaie d'obtenir le texte d'une option dans un élément de sélection et d'obtenir du texte vide à partir de getText()

Je suis tombé sur ça aussi. Je n'ai pas de belle reproduction, comme c'est arrivé lorsque j'ai essayé d'obtenir le texte d'un éditeur ACE. Mais invariablement, le texte qui manquait était le texte dans les éléments HTML internes qui n'étaient pas visibles car ils sortaient des limites de la boîte de l'éditeur ACE. Exemple:

This is <i>all</i> visible.
This is a longer line, and the second sentence is beyond the visible area. The text in tags is <i>not visible</i>.

getText() me donnerait alors :

This is all visible.
This is a longer line, and the second sentence is beyond the visible area. The text in tags is .

(Le morceau not visible manque à la deuxième ligne.)

J'ai vérifié le DOM et les éléments étaient tous là. La solution de contournement avec getAttribute('innerText') fonctionne parfaitement.

Eh bien, Selenium essaie d'exclure les éléments invisibles ( text.js#L43 ) mais il vérifie simplement les propriétés CSS visibility et display . Je ne vois pas ces attributs sur mes éléments invisibles.

<span class="ng-binding" ng-bind="data.remark">Test remarks</span>
  span.getInnerHtml().then(function(text) {
    console.log('------ element.getInnerHtml:' + text);
  });
  span.getText().then(function(text) {
    console.log('------ element.getText:' + text);
  });

Journal:
------ element.get InnerHtml : Remarques sur les tests
------ élément.getText :

Ne fonctionne pas sur Ubuntu 12.04.5 LTS - Firefox 45.0
Le même code fonctionne sur Mac v 10.11.6 - Firefox 45.4.0

J'utilise un rapporteur qui devient nul lors de l'utilisation de la liaison. S'il vous plaît des conseils. Merci

Erreur : null attendu égal à 'xyz' ;
element(by.binding('ctrl.formData.branchAddressLine1')).getAttribute('value').then(function (value) {
attendre(valeur).toEqual('xyz');
});.

Veuillez poser des questions d'assistance sur Stack Overflow

HTML :
<p class="response" style="display: block;"><strong>ERROR</strong>: The password you entered for the username <strong>testuser_2</strong> is incorrect. <a href="http://store.demoqa.com/wp-login.php?action=lostpassword">Lost your password?</a></p>

J'ai essayé avec :
driver.findElement(By.xpath("//div[@id='login_form']//p")).getAttribute("textContent");

Et j'ai obtenu le résultat textuel : "ERREUR : Le mot de passe que vous avez entré pour le nom d'utilisateur testuser_2 est incorrect. Vous avez perdu votre mot de passe ?"
getAttribute("textContent") a très bien fonctionné !

Cette page vous a été utile?
0 / 5 - 0 notes