web-dev-qa-db-fra.com

élément non interactif exception dans l'automatisation Web Selenium

Dans le code ci-dessous, je ne peux pas envoyer de clés de mot de passe dans le champ de mot de passe, j'ai essayé de cliquer sur le champ, de vider le champ et d'envoyer les clés. Mais travaille maintenant dans l'une des méthodes. Mais ça marche si je débogue et teste

  public class TestMail {
   protected static WebDriver driver;

   protected static String result;

   @BeforeClass

   public static void setup()  {
              System.setProperty("webdriver.gecko.driver","D:\\geckodriver.exe");

   driver = new FirefoxDriver();

   driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);

  }

   @Test

 void Testcase1() {

   driver.get("http://mail.google.com");

   WebElement loginfield = driver.findElement(By.name("Email"));
   if(loginfield.isDisplayed()){
       loginfield.sendKeys("[email protected]");
   }
   else{
  WebElement newloginfield = driver.findElemnt(By.cssSelector("#identifierId"));                                      
       newloginfield.sendKeys("[email protected]");
      // System.out.println("This is new login");
   }


    driver.findElement(By.name("signIn")).click();

  // driver.findElement(By.cssSelector(".RveJvd")).click();

   driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
 // WebElement pwd = driver.findElement(By.name("Passwd"));
  WebElement pwd = driver.findElement(By.cssSelector("#Passwd"));

  pwd.click();
  pwd.clear();
 // pwd.sendKeys("123");
 if(pwd.isEnabled()){
     pwd.sendKeys("123");
 }
 else{
     System.out.println("Not Enabled");
 }
12
ragesh-ragav 1993

Essayez de définir une attente implicite de peut-être 10 secondes.

gmail.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

Ou définissez une attente explicite. Une attente explicite est un code que vous définissez pour attendre qu'une certaine condition se produise avant de poursuivre dans le code. Dans votre cas, c'est la visibilité du champ de saisie du mot de passe. (Merci au commentaire de ainlolcat)

WebDriver gmail= new ChromeDriver();
gmail.get("https://www.gmail.co.in"); 
gmail.findElement(By.id("Email")).sendKeys("abcd");
gmail.findElement(By.id("next")).click();
WebDriverWait wait = new WebDriverWait(gmail, 10);
WebElement element = wait.until(
ExpectedConditions.visibilityOfElementLocated(By.id("Passwd")));
gmail.findElement(By.id("Passwd")).sendKeys("xyz");

Explication: La raison pour laquelle Selenium ne peut pas trouver l'élément est parce que l'ID du champ de saisie du mot de passe est initialement masqué par Passwd. Après avoir cliqué sur le bouton "Suivant", Google vérifie d'abord l'adresse e-mail entrée, puis affiche le champ de saisie du mot de passe (en changeant l'identifiant de Passwd-hidden en Passwd). Ainsi, lorsque le champ du mot de passe est toujours masqué (c'est-à-dire que Google vérifie toujours l'identifiant de l'e-mail), votre pilote Web commence à rechercher le champ de saisie du mot de passe avec l'identifiant Passwd qui est toujours masqué. Et donc, une exception est levée.

14
anshul Gupta

Veuillez essayer de sélectionner le champ de mot de passe comme ceci.

    WebDriverWait wait = new WebDriverWait(driver, 10);
    WebElement passwordElement = wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#Passwd")));
    passwordElement.click();
  passwordElement.clear();
     passwordElement.sendKeys("123");
4
Rostech

J'ai eu le même problème, puis j'ai trouvé la cause. J'essayais de taper une balise span au lieu d'une balise d'entrée. Mon XPath a été écrit avec une balise span, ce qui était une mauvaise chose à faire. J'ai examiné le code HTML de l'élément et j'ai trouvé le problème. Tout ce que j'ai fait ensuite, c'est de trouver la balise d'entrée qui se trouve être un élément enfant. Vous ne pouvez taper dans un champ de saisie que si votre XPath est créé avec une variable d'entrée

0
Testilla