0
votes

L'exécution JavaScript pour la frappe dans le champ de texte ne se comporte pas comme SendKeys

Je cours mes tests sur la machine Linux et là avec le code suivant, il ne tape pas le texte correctement - xxx

in ui, en réalité, un texte différent est typé comme - "sur Linux Machine je suis en cours d'exécution "," Courir sur la machine Linux, je suis "etc

Par conséquent, j'ai utilisé JavaScript comme - xxx

Comme dans le champ de texte, mais après avoir tapé cela, il y a Enregistrer le bouton qui devrait être activé mais qui n'est pas activé.

mais ce bouton est activé si SendKeys est utilisé.

Pourriez-vous s'il vous plaît laissez-moi savoir pourquoi ce javascript se comporte différemment et fournit JavaScript correct?

Comment les deux choses fonctionneront en solution unique (sans tabouillage pour activer le bouton car ce n'est pas correct dans ma situation)?


8 commentaires

Avez-vous essayé une attente explicite et ElementTobeclickable ?


Oui, j'ai essayé que pour le bouton Enregistrer et je peux voir que ce bouton n'est jamais activé.


Non, je parle de champ de saisie Avez-vous essayé d'attendre explicite et ElementTobeclickable ? puis essayer pour sendkeys ()


Oui essayé aussi bien que le même comportement.


Est-il possible de partager un lien si ce public pour diagnostiquer.


L'application que je teste est privée, n'est pas accessible publiquement.


Vous avez ceci tagué avec "JavaScript" mais le code de sélénium semble être Java.


@Gregburghardt, vous avez raison, le code de sélénium est en Java, mais il a utilisé JavaScript pour effectuer la saisie de texte. Au cas où il y a une meilleure solution de JavaScript Guys, je l'ai marqué.


3 Réponses :


0
votes

Essayez d'écrire dans un style de promesse ou async / attente de style.

async clear_elem(elem) {
    // elem.clear(), MAY not work always because of some background JS
    await elem.sendKeys(protractor.Key.chord(protractor.Key.CONTROL, 'a'));
    await elem.sendKeys(protractor.Key.DELETE);
    // Can await here for Application Load
}

reverse_string = as => as.split('').reverse().join();
// intersperse - Places an Item in between elements of an array
// ex: intersperse('k')("abc") => ['a', 'k', 'b', 'k', 'c']
intersperse = x => as => as.split('').reduce((acc, x) => [...acc, a, x], []).slice(0, -1);

(async () => {
    // Assuming you have element - visibleElement
    await browser.wait(protractor.ExpectedConditions.elementToBeClickable(visibleElement), default_timeout);

    await clear_elem(visibleElement);
    const str = reverse_string('I  am running on linux machine');
    const sequence_of_characters = intersperse(protractor.Key.HOME)(str);
    // e, HOME, n, HOME, i, HOME, h, HOME, ...
    await visibleElement.sendKeys(protractor.Key.chord(...sequence_of_characters));
})();


2 commentaires

Essayé cela mais n'a pas aidé :(


Je l'ai modifiée pour cliquer sur le bouton Accueil pour chaque personnage Entrée.



0
votes

paramètre argument [0] .value = "..." code> définit la valeur dans le champ de texte, mais aucun événement n'est déclenché sur cet élément. Le bouton "Enregistrer" attend probablement un événement code> modifier code> quelque part dans le code>. Vous devrez déclencher manuellement un événement de changement sur la zone de texte à l'aide de JavaScript. Voir Comment puis-je déclencher un événement Onchange manuellement? .

Le comportement que vous décrivez me fait penser que JavaScript écoute déjà pour l'événement de changement, puis brouillant l'ordre des mots comme si Yoda les saisit. (ou les tapé-données Yoda a?) Déclenchement de l'événement de changement manuellement peut activer le bouton "Enregistrer" et vous pouvez toujours vous retrouver avec le même texte que l'utilisation de SendKeys code> aboutirait. Si c'est le cas , vous voudrez peut-être activer le bouton "Enregistrer" avec JavaScript aussi: P>

// Set the input text
jse.executeScript("arguments[0].value='I am running on linux machine';", visibleElement);

// Find the "Save" button
WebElement saveButton = driver.findElement(...);

// Enable the save button
jse.executeScript("arguments[0].disabled = false;", saveButton);

saveButton.click();


0 commentaires

0
votes

Pour commencer avec l'élément étant visible ne garantit pas que l'élément est interactable aussi bien, c'est-à-dire cliquable ou que vous pouvez suivre la méthode d'invoquer < Code> SendKeKeys () .

Pour appeler SendKeys () Dans l'élément souhaité, vous devez induire WebDriverwait pour le ElementTobeclickable () < / Code> Et vous pouvez utiliser ce qui suit Stratégie de localisation : xxx

Vous pouvez trouver une discussion détaillée pertinente dans Comment conserver la séquence de caractères envoyée via SendKeys () méthode via Selenium et C #


tl; Dr

Sélénium: Comment Selenium identifie les éléments visibles ou non? Est possible qu'il soit chargé dans DOM mais non rendu sur l'interface utilisateur?


0 commentaires