2014-01-14 2 views
0

Im using Ghost Driver (PhantomJS) в моем проекте C#. У меня есть вопрос. Селен имеет PhantomJSWebElement и PhantomJSDriver. Im создание PhantomJSDriverSelenium IWebElement to PhantomJSWebElement

PhantomJSDriverService service = PhantomJSDriverService.CreateDefaultService(); 
service.IgnoreSslErrors = true; 
service.LoadImages = false; 
service.Start(); 
PhantomJSDriver ghostDriver = new PhantomJSDriver(service); 

А затем пытается найти элементы с помощью XPath

List<string> retVal = new List<string>(); 
var aElements = ghostDriver.FindElementsByXPath("//div[@id='menu']//a[@href]"); 
foreach(PhantomJSWebElement link in aElements) 
{ 
    try 
    { 
     retVal.Add(link.GetAttribute("href")); 
    } 
    catch (Exception) 
    { 
     continue; 
    } 
} 

Так у меня есть ошибка при литье IWebElemet в PhantomJSWebElement.

PhantomJSWebElement el = (PhantomJSWebElement)link; 

также нет работы (бросающийся литье исключая). Таким образом, вопрос в том, как получить PhantomJSWebElement от PhantomJSDriver, возвращает только IWebElement (или их коллекцию) при поиске.

+0

Этот вопрос трудно ответить без публикации точного текста исключения. Кроме того, вы уже прошли через это исключение с вашим отладчиком? Что такое 'type'' link? – Brian

+0

У меня есть русская версия на VS. Текст: Не удалось привести объект объекта. OpenQA.Selenium.Remote.RemoteWebElement "к типу" OpenQA.Selenium.PhantomJS.PhantomJSWebElement ". Он выбрасывает ссылку PhantomJSWebElement в aElements – user2598575

+0

Я предполагаю, что' link' имеет тип 'WebElement'. 'PhantomJSWebElement' наследуется от' RemoteWebElement'. Вы пробовали кастинг следующим образом: 'PhantomJSWebElement el = (RemoteWebElement) link;' вместо этого? – Brian

ответ

0

В общем, вы не должны использовать классы, специфичные для браузера, при использовании привязок .NET. Вместо этого вы должны кодировать интерфейсы, которые вы ожидаете. Это позволяет при необходимости заменить в разных реализациях. Ваш код будет выглядеть примерно так:

PhantomJSDriverService service = PhantomJSDriverService.CreateDefaultService(); 
service.IgnoreSslErrors = true; 
service.LoadImages = false; 

// Not sure I'd use Start here. The constructor will start the service 
// for you. 
service.Start(); 

// Use the IWebDriver interface. There's no real advantage to using 
// the PhantomJSDriver class. 
IWebDriver ghostDriver = new PhantomJSDriver(service); 

// ... 

List<string> retVal = new List<string>(); 
var aElements = ghostDriver.FindElements(By.XPath("//div[@id='menu']//a[@href]")); 

// Use the IWebElement interface here. The concrete PhantomJSWebElement 
// implementation gives you no advantages over coding to the interface. 
foreach(IWebElement link in aElements) 
{ 
    try 
    { 
     retVal.Add(link.GetAttribute("href")); 
    } 
    catch (Exception) 
    { 
     continue; 
    } 
} 

Следует также отметить, что существует некоторая вероятность того, что документация класса неверна. Зная исходный код для привязок к языку, класс PhantomJSWebElement никогда не запускается нигде. Я верю, что вы действительно возвращаетесь с вашего звонка FindElements(): RemoteWebElements, поэтому попытка отбросить их по иерархии наследования к более конкретному подклассу обречена на провал.

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