2017-10-23 4 views
0

셀렌 웹 드라이버를 사용하여 Gmail에 로그인하려고합니다. 내가 직면하고있는 문제는 입력 상자에 암호를 설정할 수 없다는 것입니다. 여기 셀레늄 Gmail 로그인 비밀번호 필드

생성 된 오류 메시지입니다 :

Exception in thread "main" org.openqa.selenium.WebDriverException: unknown error: cannot focus element.

여기 내 코드입니다 :

public static void main(String[] args) { 
    System.setProperty("webdriver.chrome.driver", "C:\\chromedriver.exe"); 
    WebDriver driver=new ChromeDriver(); 
    driver.navigate().to("http://www.gmail.com"); 
    driver.findElement(By.cssSelector("#identifierId")).sendKeys("********@gmail.com"); 
    driver.findElement(By.cssSelector("#identifierNext")).click(); 
    WebDriverWait wait = new WebDriverWait(driver, 10); 
    wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#password"))); 

    driver.findElement(By.cssSelector("#password")).sendKeys("********"); 
    driver.findElement(By.cssSelector("#passwordNext")).click(); 
    driver.close(); 
    driver.quit(); 
} 
+0

전체 오류 메시지를 공유 할 수 있습니까? 오류 메시지는 요소를 집중시킬 수 없지만 어떤 요소를 나타낼 수 있는지 보여줍니다. 암호 필드 또는 다른 필드입니까? –

+0

'By.cssSelector ("input [type = password]")'시도해보십시오. 당신이 틀린 요소를 붙잡고있는 것처럼 보입니다. 그게 작동한다면 나는 답으로 게시 할 것입니다. 요소가 보이지만 상호 작용할 준비가되지 않은 경우도있을 수 있습니다. – mrfreester

+0

@mrfreester By.cssSelector ("input [type = password]")이 작동하지 않습니다. –

답변

0

이 대기 문제의 조합 잘못된 요소를 선택 할 수있다. 다음과 같이

는 SendKeys 매크로에있는 당신의 선택을 변경해보십시오 :

wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("input[type=password]"))); 

: 그것은 여전히 ​​작동하지 않으면

driver.findElement(By.cssSelector("input[type=password]")).sendKeys("********"); 

, 당신은 같은 것을 호출하기 전에 다른 대기 상태를 시도 할 수 적절한 대기 조건을 찾으려면 몇 가지 실험을해야 할 수도 있지만,이 두 가지를 모두하면 필요한 것을 얻을 수 있습니다. :)

0

사용하려고하는 요소의 cssSelector가 올바르지 않습니다.

동적으로 생성 된 xpath 및/또는 cssSelector를 항상 사용하는 것이 좋습니다.

아래 코드에서 전자 메일 Id에는 동적으로 생성 된 xpath가 사용되고 암호에는 cssSelector가 동적으로 생성됩니다. 이것을 시도하고 잘 작동합니다.

public static void main(String[] args) 
{ 
    System.setProperty("webdriver.chrome.driver", "Y:\\Selenium\\chromedriver.exe"); 
    WebDriver driver=new ChromeDriver(); 
    driver.navigate().to("http://www.gmail.com"); 
    driver.findElement(By.xpath("//input[@type='email']")).sendKeys("*********@gmail.com"); 
    driver.findElement(By.cssSelector("#identifierNext")).click(); 

    WebDriverWait wait = new WebDriverWait(driver, 10); 
    wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("input[type=password]"))); 

    driver.findElement(By.cssSelector("input[type=password]")).sendKeys("*********"); 
    driver.findElement(By.cssSelector("#passwordNext")).click(); 
    driver.quit(); 
} 
0

또한처럼, 여기에 이름 atribute을 사용할 수 있습니다이 :

driver.findElement(By.name("password")).sendKeys("********"); 

내가 그러나 나는 그것이를 작동하지 않는 이유를 명확히 를 원하는 모든 것이 해결된다 생각 :

이메일을 입력하려면 ID 번호 identifierId이 제출 한 속성 중 하나이기 때문에 ID를 사용하고 정상적으로 작동했습니다. 충전재.

을 입력하려면 password을 ID로 사용할 수 없습니다. 채우려는 필드에는 해당 속성 중에서 ID가 없습니다. id password이 있지만 더 많은 양의 WebElement를 포함합니다. 사실 당신은

driver.findElement(By.xpath("//input[@type='password']")).sendKeys("********"); 

또는으로, 따라서 오류 메시지가

당신이 XPath를 사용할 수 있습니다 초점을 맞출 수없는 당신에게 을 말하고, 다른 WebElements들 사이에서이 분야를 포함하는 ID를 지역화하는 CSS 선택기와 같은 :

driver.findElement(By.cssSelector("input[type=password]")).sendKeys("********"); 

하지만 ID를 사용하여이 필드에 액세스 할 수 없습니다.

나는이 세 가지 솔루션을 모두 시험해 보았습니다. 기다릴 수있는 문제에 대해서는 웨이터가 findElement 인 래퍼를 사용하는 것을 주저하지 말고 많은 도움이 될 수 있습니다. 그러나, 나는 이것이 주요 문제가 아니라고 생각한다.