1. ホーム
  2. java

[解決済み] Selenium Web Automation で、要素が対話可能でない例外が発生する。

2022-02-05 14:55:07

質問

以下のコードで、パスワードフィールドにパスワードキーを送信できません。フィールドをクリックし、フィールドをクリアしてキーを送信してみました。しかし、今はどのメソッドでも動作しています。しかし、私はデバッグとテスト場合は動作します

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

解決方法は?

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が要素を見つけられない理由は、パスワード入力フィールドのidが最初はPasswd-hiddenであるためです。あなたが "Next" ボタンをクリックした後、Google はまず入力されたメールアドレスを検証し、次にパスワード入力フィールドを表示します(id を Passwd-hidden から Passwd に変更することで)。そのため、パスワードフィールドがまだ隠されている(つまり、Googleがまだメールアドレスを検証している)とき、Webdriverはまだ隠されているPasswdというIDのパスワード入力フィールドを検索し始めます。そのため、例外がスローされます。