Отключить стиль в поиске Google с помощью Selenium FirefoxDriver

следующий код отключает таблицы стилей и изображения на странице, загруженной с помощью веб-драйвера Selenium Firefox:

from selenium import webdriver

firefox_profile = webdriver.FirefoxProfile()
firefox_profile.set_preference('permissions.default.stylesheet', 2)
firefox_profile.set_preference('permissions.default.image', 2)

driver = webdriver.Firefox(firefox_profile)
driver.get('http://www.stackoverflow.com/')

driver.close()

Он отлично работает с stackoverflow.com, facebook.com, yahoo.com... но, что интересно, не работает с Google Search; только логотип Google исчезает, а его таблица стилей остается на месте.

Если вы попытаетесь использовать следующую ссылку http://google.com/search?q=nelson+mandela, вы получите:

введите здесь описание изображения

Принимая во внимание, что ожидаемый результат должен выглядеть так (без таблицы стилей + без изображения):

введите здесь описание изображения

  • Что здесь происходит?
  • Как это исправить?

person nazmus saif    schedule 24.11.2014    source источник
comment
Я могу воспроизвести проблему. Очень интересный вопрос.   -  person Stéphane Bruckert    schedule 24.11.2014


Ответы (2)


Логотип google происходит из css, где изображения встроены в HTML как данные (img src="data:image/jpeg;base64, ....) код отключает загрузку удаленных изображений, а не источников этого типа.

  • разрешения.default.stylesheet: отключить любое форматирование

  • разрешения.default.image: отключить любое изображение и фоновое изображение css

если изображение встроено в страницу в кодировке base64, оно не блокируется этими разрешениями, поскольку является частью кода HTML (см. http://en.wikipedia.org/wiki/Data_URI_scheme)

чтобы отключить дополнительное форматирование, вы должны добавить:

  • firefox_profile.set_preference("permissions.default.script", 2);
  • firefox_profile.set_preference("javascript.enabled", False);
person sax    schedule 27.11.2014
comment
Я не понимаю. Не могли бы вы просветить ваши объяснения? - person Stéphane Bruckert; 27.11.2014
comment
Я обновил свой ответ, не уверен, что это правильный путь, или мне нужно добавить комментарий. - person sax; 27.11.2014
comment
Вы сказали, что логотип исчез, потому что это часть CSS, которая была отключена. Тогда почему мы все еще можем видеть весь макет страницы и форматирование? - person Stéphane Bruckert; 28.11.2014
comment
макет создается встроенным javascript, попробуйте profile.set_preference(javascript.enabled, False); отключить движок javascript (не удаленные источники), и макет исчезнет - person sax; 28.11.2014
comment
хорошо, теперь изображения исчезли, но макет все еще работает с firefox_profile.set_preference(javascript.enabled, False) и firefox_profile.set_preference(permissions.default.script, 2)... - person nazmus saif; 29.11.2014
comment
оригинальная планировка? не в моем тесте. Какую версию selenium/firefox/OS вы используете? Я тестировал на селене == 2.44.0, firefox 33.1, OSX. ПРИМЕЧАНИЕ. Я думаю, что скриншот Стефана создается с помощью панели инструментов разработчика. Я не думаю, что это можно воспроизвести с помощью селена, поскольку он не является частью стандартного Firefox. - person sax; 29.11.2014
comment
такие страницы, как эта, загружаются как этот скриншот (почти обычный текст)! в чем проблема с гугл? это об этом встроенном коде? (моя версия селена = 2.44.0 браузер = Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:33.0) Gecko/20100101 Firefox/33.0) - person nazmus saif; 30.11.2014
comment
Изображения больше не отображаются, спасибо за это. Однако таблицы стилей все еще загружаются, что, должен сказать, является большой загадкой! - person Stéphane Bruckert; 30.11.2014

запустите следующий javascript через исполнителя сценария selenium

var queries = ['link[rel=stylesheet][href]', 'style'];
for (var i = 0; i < queries.length; i++) {
    var remove = document.querySelectorAll(queries[i]);
    for (var j = 0; j < remove.length; j++) {
        remove[j].outerHTML = '';
    }
}
var inline = document.querySelectorAll('*[style]');
for (var i = 0; i < inline.length; i++) {
    inline[i].removeAttribute('style');
}

Я проверил это с помощью Google, это работает. получил приведенный выше скрипт из этого расширение Firefox код

driver = webdriver.Firefox(firefox_profile)
driver.get('http://www.google.com/')
driver.execute_script("<put the above javascript here as string>")
person deepak    schedule 03.12.2014
comment
Как я вижу, вы получили награду, я думаю, что этот код работает! Я ценю это. Но у меня мало опыта работы с селеном, поэтому я не нахожу способа использовать этот код. Не могли бы вы просветить меня, как использовать исполнителя скрипта селена или куда поместить скрипт? @дипак - person nazmus saif; 08.12.2014
comment
@nazmussaif: обновил ответ. надеюсь, это поможет. - person deepak; 08.12.2014