2017-02-07 7 views
1

У меня очень странная проблема. Я пытаюсь открыть facebook> кликнуть по ссылке забытого аккаунта>, затем открыть его на новой вкладке> щелкнуть два текстовых поля. Мой код:Невозможно щелкнуть элемент, используя webdriver

import java.awt.AWTException; 
import java.awt.Robot; 
import java.awt.event.KeyEvent; 
import java.util.ArrayList; 
import java.util.concurrent.TimeUnit; 

import org.openqa.selenium.By; 
import org.openqa.selenium.Keys; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.WebElement; 
import org.openqa.selenium.chrome.ChromeDriver; 
import org.openqa.selenium.interactions.Actions; 
import org.openqa.selenium.support.ui.ExpectedConditions; 
import org.openqa.selenium.support.ui.WebDriverWait; 


public class OpenLinkInNewTabTest { 

    public static void main(String[] args) throws Exception { 
     System.setProperty("webdriver.chrome.driver", "<path>\\chromedriver.exe"); 
     WebDriver driver = new ChromeDriver(); 

     driver.get("http://www.facebook.com"); 
     String ParentWindowHandle = driver.getWindowHandle(); 
     WebElement w = driver.findElement(By.linkText("Forgotten account?")); 


     new Actions(driver) 
     .keyDown(Keys.CONTROL) 
     .keyDown(Keys.SHIFT) 
     .click(w) 
     .keyUp(Keys.SHIFT) 
     .keyUp(Keys.CONTROL) 
     .perform(); 

    new Actions(driver) 
     .sendKeys(Keys.CONTROL + "w") 
     .perform(); 




    // ArrayList<String> tabs = new ArrayList<String> (driver.getWindowHandles()); 
// 
// driver.switchTo().window(tabs.get(1)); 
// WebElement fn = (new WebDriverWait(driver, 20)) 
//   .until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#identify_email"))); 
// System.out.println(driver.getTitle()); 
// fn.sendKeys("abcdejf:"); 



    for(String winHandle : driver.getWindowHandles()){ 

     driver.switchTo().window(winHandle); 
     if(driver.getTitle().contains("Forgotten Password ")){ 

      Thread.sleep(5000); 


       driver.findElement(By.cssSelector("#identify_email")).sendKeys("adf"); 
      driver.findElement(By.name("email")).sendKeys("ASF"); 
      driver.close(); 
      driver.switchTo().window(ParentWindowHandle); 

      break; 

     } 
    } 


    driver.findElement(By.name("email")).sendKeys("ASF"); 

    } 

} 

Однако, я не могу отправить значение

driver.findElement(By.cssSelector("#identify_email")).sendKeys("adf"); 

элемент выглядит как:

<input id="identify_email" class="inputtext" name="email" autofocus="1" type="text"> 

Если я пишу подобный код, как:

System.setProperty("webdriver.chrome.driver","path\\chromedriver.exe"); 
     WebDriver driver = new ChromeDriver(); 
     driver.get("http://www.facebook.com"); 

     driver.findElement(By.linkText("Forgotten account?")).click(); 

     driver.findElement(By.name("email")).sendKeys("ASF"); 
     driver.findElement(By.cssSelector("#identify_email")).sendKeys("adf"); 

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

Выполнение этого кода иногда показывают

Exception in thread "main" org.openqa.selenium.InvalidElementStateException: invalid element state 
    (Session info: chrome=56.0.2924.87) 
+0

Вы получаете ошибку или поле просто остается пустым? –

+0

Я не получаю никаких ошибок в консоли, и поле также остается пустым. – Avishek2585835

+0

Выбор по имени «email» дает два поля ввода. У формы в верхней части страницы также есть поле, названное так. WebDriver вернет только первый, используя 'findElement (By.name (« email »)). Однако ваш селектор css должен работать. Я предлагаю вам попробовать 'By.id (« ident_email »)' –

ответ

2

Дождаться этого элемента:

WebDriverWait wait = new WebDriverWait(driver, 10); 
String email = "[email protected]"; 
WebElement emailInputField = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#identify_email"))); 
JavascriptExecutor executor = (JavascriptExecutor) driver; 
executor.executeScript("arguments[0].setAttribute('value', ' " + email + "')", emailInputField); 
break; 

Нажатие кнопки активирует этот элемент.

+0

Вся страница построена из JS, так что это действительно поможет. С другой стороны, WebDriver должен генерировать исключение, если элемент не может быть найден. –

+0

Я пробовал это с 20 секундами как время ожидания, а не работаю. Также не было никаких исключений. – Avishek2585835

+0

@ Avishek2585835, я отредактировал свой ответ. Этот код должен войти в ваш if-блок. –