2017-02-22 71 views
0

Мой код с неявным ожиданием работает хорошо. Но я читал информацию о ожиданиях и понимал, что мне нужно явно использовать ожидания в своих проектах. Вот почему я пытаюсь реализовать свой тестовый проект. Когда шаг моего alhorithm equel нажимает на кнопку, у меня есть ошибка: http://joxi.ru/BA0GMyDhnY0n2y Пожалуйста, помогите мне с ней.WebDriver: явно ждать не работает, нажав на элемент

Базовый класс:

using NUnit.Framework; 
using System; 
using LinkedinAddContacts.Pages; 
using LinkedinAddContacts.TestData; 
using OpenQA.Selenium; 
using OpenQA.Selenium.Chrome; 
using OpenQA.Selenium.Support.UI; 

namespace LinkedinAddContacts 
{ 
    [TestFixture] 
    public class TestClass 
    { 
     private IWebDriver webDriver; 
     private WebDriverWait waitDriver; 

     [SetUp] 
     public void InitializeBrowser() 
     { 
      webDriver = new ChromeDriver(); 
      waitDriver = new WebDriverWait(webDriver, TimeSpan.FromSeconds(10)); 
      webDriver.Manage().Window.Maximize(); 
      webDriver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(30); 
      webDriver.Navigate().GoToUrl("https://www.linkedin.com/"); 
     } 
     [Test] 
     public void TestMethod() 
     { 
      Authorization authorizationData = new Authorization(); 
      StartPage objStartPage = new StartPage(waitDriver); 
      NetworkPage objNetworkPage = new NetworkPage(waitDriver); 

      objStartPage.EntrySystem(authorizationData); 
      objNetworkPage.ConnectPeople(); 
     } 

     [TearDown] 
     public void CloseBrowser() 
     { 
      webDriver.Quit(); 
     } 
    } 
} 

Вторичный класс:

using NUnit.Framework; 
using LinkedinAddContacts.TestData; 
using OpenQA.Selenium; 
using OpenQA.Selenium.Support.UI; 

namespace LinkedinAddContacts.Pages 
{ 
    public class StartPage 
    { 
     // private IWebDriver webDriver; 
     private WebDriverWait waitDriver; 
     #region Objects 

     public StartPage(WebDriverWait waitDriver) 
     { 
      this.waitDriver = waitDriver; 
     } 

     private IWebElement EmailInput 
     { 
      get 
      { 
       return waitDriver.Until(ExpectedConditions.ElementToBeClickable(By.Name("session_key"))); 
       //return webDriver.FindElement(By.Name("session_key")); 
      } 
     } 

     private IWebElement PasswordInput 
     { 
      get 
      { 
       return waitDriver.Until(ExpectedConditions.ElementToBeClickable(By.Name("session_password"))); 
       // return webDriver.FindElement(By.Name("session_password")); 
      } 
     } 

     private IWebElement LoginButton 
     { 
      get 
      { 
       return waitDriver.Until(ExpectedConditions.ElementToBeClickable(By.Name("login-submit"))); 
       //return webDriver.FindElement(By.Id("login-submit")); 
      } 
     } 

     private IWebElement RegistrationForm 
     { 
      get 
      { 
       return waitDriver.Until(ExpectedConditions.ElementToBeClickable(By.Id("regForm"))); 
      // return webDriver.FindElement(By.Id("regForm")); 
      } 
     } 
     #endregion 
     #region Methods 
     public void CloseRegistrationForm() 
     { 
      IJavaScriptExecutor js = waitDriver as IJavaScriptExecutor; 
      js.ExecuteScript("document.getElementById('regForm').style.display = 'none';"); 
      // ((IJavascriptExecutor)driver).executeScript("scroll(0,400)"); 

     } 


     public void EntrySystem(Authorization authorizationData) 
     { 
      // CloseRegistrationForm(); 
      EmailInput.SendKeys(authorizationData.Email); 
      PasswordInput.SendKeys(authorizationData.Password); 
      LoginButton.Click(); 
     } 
     #endregion 
    } 
} 

Ошибка есть:

public void EntrySystem(Authorization authorizationData) 
    { 
     // CloseRegistrationForm(); 
     EmailInput.SendKeys(authorizationData.Email); 
     PasswordInput.SendKeys(authorizationData.Password); 
     LoginButton.Click(); 
    } 

ответ

0

Когда я понимаю, что это правильно ваш код аварий на этой линии:

return waitDriver.Until(ExpectedConditions.ElementToBeClickable(By.Name("login-submit"))); 

Теперь, взглянув на начальную страницу linkedIn, показано, что кнопка login-submit не имеет определяемого атрибута имени, но вместо этого вы можете использовать ее id.

<input tabindex="1" id="login-submit" class="login submit-button" type="submit" value="Einloggen"> 

Таким образом, вы должны использовать By.id() вместо By.name().

+0

OMG! Это мой отказ. +10 к вашей карме, хороший человек. – s3ngeeer

0

Важно отметить, какой веб-драйвер вы используете.

Прежде всего, как говорит @Robert, его лучше найти по идентификатору, когда он доступен для вас.

Во-вторых, я думаю, что LoginButton.Click() не работает. У меня была такая проблема с драйвером хрома. Когда изменяется масштаб страницы (масштабирование), метод Click не работает должным образом или нажимает в другом месте на странице.

Я рекомендую вам использовать SendKeys для любого действия click. Так же, как это:

LoginButton.SendKeys(Keys.Enter);// or Keys.Return 

Никогда не используйте Нажмите методу

+0

Благодарим вас за советы, я отношусь к своим навыкам. Я ни о чем не говорил. – s3ngeeer

+0

Ваш совет помогает мне в другом проекте. Больше одной недели я страдал от неприступной кнопки. Еще раз спасибо – s3ngeeer

+0

Общие впечатления мне очень помогли. Добро пожаловать – Efe