исключение элемента, не связанного с взаимодействием в веб-автоматизации Selenium

В приведенном ниже коде я не могу отправить ключи пароля в поле пароля, я попытался щелкнуть поле, очистить поле и отправить ключи. Но сейчас работаю любым из способов. Но он работает, если я отлаживаю и тестирую

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

person ragesh-ragav 1993    schedule 19.07.2017    source источник


Ответы (9)


Попробуйте установить неявное ожидание примерно 10 секунд.

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

Или установите явное ожидание. Явное ожидание - это код, который вы определяете для ожидания наступления определенного условия, прежде чем продолжить выполнение кода. В вашем случае это видимость поля ввода пароля. (Благодаря комментарию 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");

Объяснение. Причина, по которой selenium не может найти элемент, заключается в том, что идентификатор поля ввода пароля изначально скрыт с помощью Passwd. После того, как вы нажмете кнопку «Далее», Google сначала проверит введенный адрес электронной почты, а затем покажет поле для ввода пароля (изменив идентификатор с Passwd-hidden на Passwd). Итак, когда поле пароля все еще скрыто (т.е. Google все еще проверяет идентификатор электронной почты), ваш веб-драйвер начинает поиск поля ввода пароля с идентификатором Passwd, который все еще скрыт. И, следовательно, создается исключение.

person anshul Gupta    schedule 19.07.2017

вы также можете попробовать полный xpath, у меня была аналогичная проблема, когда мне приходилось нажимать на элемент, который имеет свойство javascript onclick function. сработал полный метод xpath, и не было сгенерировано никаких взаимодействующих исключений.

person Sachin Singh    schedule 21.05.2020
comment
У меня был такой же опыт. Хотя было бы неплохо понять, почему .. - person Seba92; 28.10.2020

Пожалуйста, попробуйте выбрать такое поле пароля.

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

Ошибка элемент не взаимодействует может означать две вещи:

а. Элемент не отображается должным образом:

Решение для этого - просто использовать неявное / явное ожидание

  • Неявное ожидание:

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

  • Явное ожидание:

    WebDriverWait wait = новый WebDriverWait (драйвер, 20); element1 = wait.until (ExpectedConditions.elementToBeClickable (By.className (fa-stack-1x)));

б. Элемент обработан, но его нет в видимой части экрана:

Решение - просто прокрутить до элемента. В зависимости от версии Selenium с этим можно справиться по-разному, но я предоставлю решение, которое работает во всех версиях:

    JavascriptExecutor executor = (JavascriptExecutor) driver;
    executor.executeScript("arguments[0].scrollIntoView(true);", element1);
  1. Предположим, что все это не удается, тогда другой способ - снова использовать исполнителя Javascript следующим образом:

    executeor.executeScript (arguments [0] .click () ;, element1);

  2. Если щелкнуть по-прежнему не удается, это может снова означать две вещи:

1. Iframe

Проверьте DOM, чтобы увидеть, живет ли проверяемый элемент в каком-либо кадре. Если это правда, вам нужно будет переключиться на этот фрейм, прежде чем пытаться выполнить какую-либо операцию.

    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. Новая вкладка

Если открылась новая вкладка и элемент существует на ней, вам снова нужно закодировать что-то вроде ниже, чтобы переключиться на нее, прежде чем пытаться выполнить операцию.

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() 
}
person user3251882    schedule 11.05.2021

В моем случае элемент, сгенерировавший исключение, был кнопкой, принадлежащей форме. Я заменил

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

с участием

btnLogin.submit();

Моя среда была хромированной Windows 10

person Roberto Petrilli    schedule 06.09.2020

У меня была та же проблема, но я выяснил причину. Я пытался ввести тег диапазона вместо тега ввода. Мой XPath был написан с тегом span, что было неправильно. Я просмотрел HTML-код элемента и обнаружил проблему. Все, что я тогда сделал, - это нашел тег ввода, который оказался дочерним элементом. Вы можете ввести поле ввода только в том случае, если ваш XPath создан с входным тэгом.

person Testilla    schedule 22.07.2019

Я собираюсь оградить свой ответ следующим: я знаю, что это чушь ... и должен быть способ получше. (См. Ответы выше) Но я попробовал все предложения здесь и все равно не получил. Закончил погоню за ошибками, разорвав код на биты. Затем я попробовал это:

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') 

Это довольно невыносимо, и вы должны быть уверены, что не потеряете фокус, иначе вы просто будете табуляцией и интервалом не то, что нужно.

Мое предположение о том, почему другие методы не сработали для меня, заключается в том, что я пытаюсь нажать на то, что разработчики не хотели, чтобы бот нажимал. Так что я не нажимаю на нее!

person d6stringer    schedule 09.12.2020

Если он работает в отладке, то wait должно быть правильным решением.
Я предлагаю использовать явное wait, как показано ниже:

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

Я получил эту ошибку, потому что использовал неправильный селектор CSS с функцией Selenium WebDriver Node.js By.css().

Вы можете проверить правильность выбора, используя его в веб-консоли своего веб-браузера (сочетание клавиш Ctrl + Shift + K) с помощью функции JavaScript document.querySelectorAll().

person baptx    schedule 31.12.2020