element niet interactief uitzondering in selenium webautomatisering

In de onderstaande code kan ik geen wachtwoordsleutels in het wachtwoordveld verzenden, ik heb geprobeerd op het veld te klikken, het veld leeg te maken en de sleutels te verzenden. Maar nu werken in een van de methoden. Maar het werkt als ik debug en test

 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");
 }

Antwoord 1, autoriteit 100%

Probeer een impliciete wachttijd van misschien 10 seconden in te stellen.

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

Of stel een expliciete wachttijd in. Een expliciete wachttijd is code die u definieert om te wachten op een bepaalde voorwaarde voordat u verder gaat in de code. In uw geval is dit de zichtbaarheid van het invoerveld voor het wachtwoord. (Dankzij de opmerking van 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");

Verklaring: de reden dat selenium het element niet kan vinden, is omdat de id van het invoerveld voor het wachtwoord aanvankelijk is verborgen met een wachtwoord. Nadat u op de knop “Volgende” hebt geklikt, verifieert Google eerst het ingevoerde e-mailadres en toont vervolgens het invoerveld voor het wachtwoord (door de id te wijzigen van Passwd-hidden in Passwd). Dus als het wachtwoordveld nog steeds verborgen is (d.w.z. Google is nog steeds de e-mail-ID aan het verifiëren), begint uw webstuurprogramma te zoeken naar het wachtwoordinvoerveld met id Passwd dat nog steeds verborgen is. En daarom wordt er een uitzondering gegenereerd.


Antwoord 2, autoriteit 26%

je kunt ook full xpath proberen, ik had een soortgelijk probleem waarbij ik op een element moest klikken dat een eigenschap javascript onclick-functie heeft. de volledige xpath-methode werkte en er werd geen interactieve uitzondering gegenereerd.


Antwoord 3, autoriteit 21%

Probeer het wachtwoordveld op deze manier te selecteren.

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

Antwoord 4, Autoriteit 16%

“element niet interacteerbaar” fout kan betekenen twee dingen:

a. -element heeft niet goed weergegeven:

Oplossing hiervoor is gewoon om impliciet / expliciet wachten te gebruiken

  • Impliciet WACHT:

    Driver.manage (). Time-outs (). ImplicietWait (50, timeUnit.seconds);

  • Expliciteren:

    Webdriverwait wacht = nieuwe webdriverwait (stuurprogramma, 20);
    Element1 = Wait.Until (verwachteconditions.elementtobeclickable (by.classname (“FA-Stack-1x”));

b. -element is weergegeven, maar het bevindt zich niet in het zichtbare deel van het scherm:

Oplossing is gewoon om te scrollen tot het element. Op basis van de versie van Selenium kan het op verschillende manieren worden behandeld, maar ik zal een oplossing bieden die in alle versies werkt:

   JavascriptExecutor executor = (JavascriptExecutor) driver;
    executor.executeScript("arguments[0].scrollIntoView(true);", element1);
  1. Stel dat al dit mislukt, een andere manier is om opnieuw gebruik te maken van JavaScript-uitvoerder als volgt:

    Uitvoering.Executescript (“Argumenten [0]. Klik ();”, Element1);

  2. Als u nog steeds niet kunt klikken, dan kan het nog eens twee dingen betekenen:

1. Iframe

Controleer de DOM om te zien of het element dat u in een frame leeft. Als dat waar is, moet u overschakelen naar dit frame voordat u een bewerking probeert.

   driver.switchTo().frame("a077aa5e"); //switching the frame by ID
    System.out.println("********We are switching to the iframe*******");
    driver.findElement(By.xpath("html/body/a/img")).click();

2. Nieuw tabblad

Als er een nieuw tabblad is geopend en het element bestaat erop, dan moet je opnieuw iets als hieronder coderen om ernaar te schakelen voordat je het probeert.

String parent = driver.getWindowHandle();
driver.findElement(By.partialLinkText("Continue")).click();
Set<String> s = driver.getWindowHandles();
// Now iterate using Iterator
Iterator<String> I1 = s.iterator();
while (I1.hasNext()) {
String child_window = I1.next();
if (!parent.equals(child_window)) {
    driver.switchTo().window(child_window);
    element1.click() 
}

Antwoord 5, autoriteit 11%

In mijn geval was het element dat de Exception genereerde een knop die bij een formulier hoorde. ik heb vervangen

WebElement btnLogin = driver.findElement(By.cssSelector("button"));
btnLogin.click();

met

btnLogin.submit();

Mijn omgeving was chromedriver windows 10


Antwoord 6

Ik had hetzelfde probleem en heb toen de oorzaak gevonden. Ik probeerde een span-tag in te voeren in plaats van een invoertag. Mijn XPath was geschreven met een span-tag, wat verkeerd was om te doen. Ik heb de Html voor het element beoordeeld en het probleem gevonden. Het enige wat ik toen deed, was de invoertag vinden die toevallig een onderliggend element is. U kunt alleen in een invoerveld typen als uw XPath is gemaakt met een invoertagnaam


Antwoord 7

Ik ga dit antwoord hiermee afdekken: ik weet dat het onzin is.. en er moet een betere manier zijn. (Zie bovenstaande antwoorden) Maar ik heb alle suggesties hier geprobeerd en kreeg nog steeds nul. Eindigde met het achtervolgen van fouten, het rippen van de code in stukjes. Toen probeerde ik dit:

import keyboard    
keyboard.press_and_release('tab')
keyboard.press_and_release('tab')
keyboard.press_and_release('tab') #repeat as needed
keyboard.press_and_release('space') 

Het is behoorlijk onuitstaanbaar en je moet ervoor zorgen dat je de focus niet verliest, anders ga je gewoon op de verkeerde dingen klikken en spatie.

Mijn veronderstelling over waarom de andere methoden niet voor mij werkten, is dat ik probeer te klikken op iets waarvan de ontwikkelaars niet wilden dat een bot erop klikt. Dus ik klik er niet op!


Antwoord 8

Als het werkt in de foutopsporing, moet waitde juiste oplossing zijn.
Ik zal voorstellen om de expliciete waitte gebruiken, zoals hieronder weergegeven:

WebDriverWait wait = new WebDriverWait(new ChromeDriver(), 5);
wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#Passwd")));

Antwoord 9

Ik kreeg deze foutmelding omdat ik een verkeerde CSS-selector gebruikte met de Selenium WebDriver Node.js-functie By.css().

U kunt controleren of uw selector correct is door deze te gebruiken in de webconsole van uw webbrowser (Ctrl+Shift+K sneltoets), met de JavaScript-functie document.querySelectorAll().

Other episodes