Професионална програма
Loading...
Yavor2012 avatar Yavor2012 15 Точки

Локализиране на Gmail Password field

Колеги, от няколко часа се мъча да се логна в Gmail и леко удрям на камък. Полето Email го минавам абсолютно стандартно с id и след това sendKeys(); На следващата страница , когато ми излиза Password кода гърми. NoSuchElementException, което доколкото разбрах означава, че на намира такъв елемент. Използвам Идето на Селениум и то ми показва няколко варианта за мачване на въпросното поле, сред които:

-//input[@id='Passwd'], като xpath.

-id=Passwd , като id.

-css=#Passwd, като cssSelector.

Изпробвам всичките варианти и всеки път достигам до тази грешка. Сигурен съм , че това е локацията , но не разбирам защо идва грешката. Ще ви бъда благодарен за малко помощ.

Поздрави!

Тагове:
0
Open Courses
softuniobserver avatar softuniobserver 73 Точки

Дали използваш wait преди да работиш с password? Ако не, значи кода ти се изпълнява по - бързо от колкото се рендира страницата и затова става тази грешка.

http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp

 

1
18/08/2015 15:36:14
Yavor2012 avatar Yavor2012 15 Точки

Сега погледнах. Не използвам. Принципа ми е : WebElement passField=drive.findElement(By. // и тук вече според зависи какво търся); После passField.sendKeys(  и тук паролата);

Гледам да спазвам точно инструкциите. 

 

0
softuniobserver avatar softuniobserver 73 Точки

Инструкциите на лаб - а ли спазваш? Там (abv.bg) email и password са на 1 страница и полетата са се заредили вече. В gmail двете полета са на различни страници.

(https://accounts.google.com/ServiceLogin?service=mail&continue=https://mail.google.com/mail/#identifier)

(https://accounts.google.com/ServiceLogin?service=mail&continue=https://mail.google.com/mail/#password)

 

1
Yavor2012 avatar Yavor2012 15 Точки

Не от лаб-а. Те са различни. Трябваше да сваля и chromedriver.exe , за да влезе изобщо в Chrome. И да - Първа страница минава без проблем, това е полето с юзъра и на втора страница гърмим, опитвайки се да локирам полето с паролата. Не схващам защо. 

0
softuniobserver avatar softuniobserver 73 Точки

Не съм намерила кои инструкции използваш.

Ако искаш пробвай следното:

Thread.sleep(1000);

преди да работиш с password

Ако искаш може да покажеш и кода ти.

И продължавам да си мисля, че кода ти е по - бърз от зареждането на втората страница и затова има грешка - web driver не намира елемента, защото не се е заредил така бързо, както ти се изпълнява програмата.

1
18/08/2015 18:01:44
Yavor2012 avatar Yavor2012 15 Точки

Ето го и кода, който ползвам:

 public void theAfterMethod()  {
        System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir") + "\\chromedriver.exe" );
        chromeDriver = new ChromeDriver();
        chromeDriver.get("http://gmail.com");
        String userName="yavorlazarov2012@gmail.com";
        String password = "20121895";
        //Input username and press the button "Next";
        WebElement user=chromeDriver.findElement(By.id("Email"));
        user.sendKeys(userName);
        
        WebElement loginBut=chromeDriver.findElement(By.id("next"));
        loginBut.click();
       
        //Step 5: Inspect Element password , inspect element sign in button. Go in to the inbox.
        WebElement pass=chromeDriver.findElement(By.cssSelector("css=#Passwd"));
        System.out.println(pass.getText());



        String buttonId="signIn";
        WebElement entryButton=driver.findElement(By.id(buttonId));
        entryButton.click();


}



Не знам каква е причината. Може и да си права. Пробвах с твоят съвет, като сложих нишката преди зареждането на втората страница но грешката е идентична. 

0
softuniobserver avatar softuniobserver 73 Точки

Става ли да пробваш да махнеш "css=" от string - a, който подаваш на cssSelector метода

от

WebElement pass=chromeDriver.findElement(By.cssSelector("css=#Passwd"));

 

и да остане така:

 

WebElement pass=chromeDriver.findElement(By.cssSelector("#Passwd"));

 

 

1
18/08/2015 22:24:07
Yavor2012 avatar Yavor2012 15 Точки

Пробвах и така. И така и с нишката и пак същата грешка. Стейндж е цялата работа. laugh

0
softuniobserver avatar softuniobserver 73 Точки

Работи си ти с кода с имплицитен wait, който го сложих преди  да търси елемент с id=Passwd.    

     //Step 5: Inspect Element password , inspect element sign in button. Go in to the inbox.
      chromeDriver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); // added this code
      WebElement pass=chromeDriver.findElement(By.cssSelector("#Passwd"));
      

Ако трябва експлицитен wait, тогава:

      //Step 5: Inspect Element password , inspect element sign in button. Go in to the inbox.
      WebElement pass = (new WebDriverWait(chromeDriver, 30))
    		  .until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#Passwd")));
      

Целия метод: http://pastebin.com/hmpMxVut

Резултата: http://screencast.com/t/w7QZemfUF

Може би е добре да си смениш паролата за пощата :)

 

0
19/08/2015 03:27:26
Yavor2012 avatar Yavor2012 15 Точки

Дааа, аахахахах благодаря ти за отделеното време и предоставените варианти. А за пощата...хем щях да внимавам, хем нещо недогледах май накрая и я постнах. Ще сменя паролата и мерси отново!-Сега ще пробвам последния вариант.

 

Поздрави! 

0
IBraynov avatar IBraynov 74 Точки

Правилно е да използваш explicit wait, ако се отнася за конкретен елемент.

Ако ти е интересно и искаш да разбереш защо, може да погледнеш тук в тази тема, където сме го дискутирали.

 

1