Как скрыть FirefoxDriver (используя Selenium) без ошибки функции findElement в PhantomDriver(браузер без головы)?
Я пытаюсь сделать скрытый FirefoxDriver. Согласно моим исследованиям, я должен использовать PhantomJSDriver, но когда я использую драйвер PhantomJSDriver. Оператор FindElement больше не работает.
var options = new PhantomJSOptions();
options.AddAdditionalCapability("phantomjs.page.settings.userAgent",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/40.0.2214.94 Safari/537.36");
PhantomJSOptions p = new PhantomJSOptions();
var service = PhantomJSDriverService.CreateDefaultService();
service.SslProtocol = "any";
service.ProxyType = "http";
service.WebSecurity = false;
service.IgnoreSslErrors = true;
var driver = new PhantomJSDriver(service, options);
driver.Navigate().GoToUrl("https://www.google.com.tr/");
Thread.Sleep(5000);
driver.FindElement(By.XPath("//*[@id='lst-ib']")).SendKeys("edd");
string s = driver.Url;
Console.WriteLine(s);
Сообщение об ошибке:
Произошло необработанное исключение типа "OpenQA.Selenium.NoSuchElementException" в WebDriver.dll
Дополнительная информация: {"errorMessage":"Невозможно найти элемент с xpath '// [@id =' _ fZl ']/ span / svg / path'", "request": {"headers": {"Accept": " application / json, image / png "," Connection ":" Close "," Content-Length ":" 57 "," Content-Type ":" application / json; charset = utf-8 "," Host ":" локальный:50454"},"httpVersion":"1.1","метод":"POST","пост":"{\", используя \":\" XPATH \ "\ "значение \": \" // [@id = '_ FZL']/ SPAN / SVG / путь \ "}", "URL": "/ элемент", "urlParsed":{"якоря": "", "запрос": "", "файл": "элемент", "каталог": "/", "путь": "/ элемент", "относительный": "/ элемент", "порт": "", "хозяин": "", "пароль":" ", "пользователь": "", "UserInfo":"","власть": "", "протокол": "", "источник": "/ элемент","queryKey":{},"куски":["элемент"]},"urlOriginal":"/ сеанса /feab13f0-720f-11e7-80b3-452aee308158/ элемент"}}
Есть ли другой способ скрыть FirefoxDriver? Не могли бы вы мне помочь, пожалуйста?
3 ответа
Я решил это. Прежде всего, мы можем использовать PhantomJS, не показывая его консоль следующим кодом:
IWebDriver driver;
var driverService = PhantomJSDriverService.CreateDefaultService();
driverService.HideCommandPromptWindow = true;
driver = new PhantomJSDriver(driverService);
Второе за ошибку, которую я упомянул. Google возвращает разные HTML-страницы для браузеров, поэтому идентификатор или Xpath в браузере PhantomJS будут отличаться от того, который я экспортировал при открытии Firefox. Когда я использовал
string html=driver.PageSource;
чтобы узнать, какой правильный XPath или Id, функция findElement работает хорошо.
Например: Для результатов сайта Google. Первая ссылка XPath в FirefoxDriver
"//*[@id='rso']/div/div/div[1]/div/div/h3/a"
XPath первой ссылки в PhantomJSDriver
"//*[@id='ires']//ol/div[1]/h3/a"
Начиная с версии 55+ для Linux и 56+ для Windows и OSX, Firefox поддерживает -headless
опция командной строки. Это должно быть использовано так:
o = selenium.webdriver.FirefoxOptions()
o.set_headless()
driver=selenium.webdriver.Firefox(options=o)
Соответствующий код в C# будет:
var o = new FirefoxOptions()
o.AddArgument('-headless')
var driver = new FirefoxDriver(o)
Потому что.NET-оболочка не поддерживает.headless
собственность
Нет способа скрыть FirefoxDriver как таковой. Вы можете запустить его на виртуальной машине и свернуть окно виртуальной машины, но это не практично для большинства людей.
Давайте посмотрим на вашу реальную проблему. Похоже, что Google присваивает идентификатор окна поиска с помощью js, чтобы предотвратить его удаление, поскольку это противоречит их условиям обслуживания.
У вас есть несколько вариантов здесь:
1) найдите элемент, используя имя 'q', так как он назван так, независимо от phantomjs или firefox.
2) просто перейдите непосредственно на страницу результатов поиска: https://www.google.com.tr/search?q=edd