2014-04-15 4 views
2

Использование selenium в C# Я пытаюсь открыть браузер, перейти в Google и найти текстовое поле поиска.Selenium - C# - Webdriver - Не удается найти элемент

Стараюсь ниже

IWebDriver driver = new InternetExplorerDriver(@"C:\"); 

driver.Navigate().GoToUrl("www.google.com"); 

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(5)); 

IWebElement password = driver.FindElement(By.Id("gbqfq")); 

но получить следующее сообщение об ошибке -

Не удалось найти элемент с идентификатором == gbqfq

+1

Какую версию Internet Explorer вы используете? Известны проблемы с поддержкой IE 11 с Selenium Web Driver. –

+4

Кроме того, мое честное предложение было бы использовать ** любую другую веб-страницу, кроме Google **. К сожалению, большинство людей выбирают Google в качестве своего «стартового приложения» для работы Selenium, но это, безусловно, один из самых сложных сайтов, с которыми вы столкнетесь (т.е. разметка - это ад и сведено к минимуму) - вы столкнетесь с проблемами, с сайтом Google, что вы не будете с другими. Начните с себя с самого начала! – Arran

+0

Возможно, вы уже проверили это, но этот идентификатор не генерируется динамически, не так ли? Если это так, то идентификатор не будет надежным способом найти элемент ... – autoKarma

ответ

0

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

int timeout =0; 
while (driver.FindElements(By.id("gbqfq")).Count == 0 && timeout <500){ 
    Thread.sleep(1); 
    timeout++; 

} 
IWebElement password = driver.FindElement(By.Id("gbqfq")); 

это должно помочь убедиться, что e элемент действительно успел появиться.

также обратите внимание, что идентификатор «gbqfq» является своего рода запахом. Я мог бы попробовать что-то более значимое, чтобы соответствовать этому идентификатору.

+2

Это всего лишь повторная реализация 'WebDriverWait'. Также 'Count' следует заменить на' Any'. – Arran

2

Это выглядит как копия this question, на которую уже был дан ответ.

Я могу показать вам, что я сделал, что, кажется, работает хорошо для меня:

public static IWebElement WaitForElementToAppear(IWebDriver driver, int waitTime, By waitingElement) 
{ 
     IWebElement wait = new WebDriverWait(driver, TimeSpan.FromSeconds(waitTime)).Until(ExpectedConditions.ElementExists(waitingElement)); 
     return wait; 
} 

Это должно ждать WaitTime количество времени, пока либо элемент найден или нет. Я столкнулся с множеством проблем с динамическими страницами, не загружая нужные мне элементы сразу, а WebDriver пытается найти элементы быстрее, чем страница может их загрузить, и это мое решение. Надеюсь, поможет!

Смежные вопросы