Браузер инициализируется следующим образом:
from selenium import webdriver
from selenium.webdriver.firefox.options import Options as FirefoxOptions
options = FirefoxOptions()
options = FirefoxOptions()
profile = webdriver.FirefoxProfile()
profile.set_preference("browser.download.folderList", 2)
profile.set_preference("browser.download.manager.showWhenStarting", False)
profile.set_preference("browser.download.manager.useWindow", True)
profile.set_preference("browser.download.dir", "" + dwnld_path + "")
profile.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/pdf,application/msword,text/csv")
self.wd = webdriver.Firefox(firefox_profile=profile, options=options, capabilities={"marionette":
True}, executable_path="" + wd_path + "/geckodriver.exe",
firefox_binary="C:/Program Files/Mozilla
Firefox 60/firefox.exe")
Но, тем не менее, при загрузке файла все равно появляется диалоговое окно, с которым
ничего не происходит.
Отсюда возник вопрос: а Firefox вообще может сохранять файлы, которые скачиваются
не по ссылке, а подсовываются через JS?
Ответы
Ответ 1
дело оказалось в настройке по умолчанию "Предпросмотр PDF", что решилось дополнительной
преференсой:
profile.set_preference("pdfjs.disabled", True)
Хочу отпарсить JSON с сохраненными закладками из Firefox, но там очень много параметров,
о назначении которых можно только догадываться (в частности, типы папок). А я хочу
сделать нормальный импорт закладок из FF в свой софт (не костыльный, а в соответствии
с документацией, которую я, к сожалению, на нашел).
Есть ли вообще такое? Или может кто разбирался в этом вопросе и написал свою инструкцию? :)
P.S. На https://developer.mozilla.org/ не нашел. Есть некоторые похожие вопросы,
но по сути не то: https://stackoverflow.com/questions/904522/output-firefox-json-data.
Ответы
Ответ 1
Firefox хранит закладки, историю загрузок и посещений в базе данных SQLite, в файле
places.sqlite, который находится в папке %APPDATA%\Mozilla\Firefox\Profiles\[RANDOM.PROFILENAME].
В своей программе Вы можете открыть эту базу и прочесть любые интересующие данные
(в том числе и перевести их в формат JSON). Есть небольшое разъяснение по структуре
тут: http://kb.mozillazine.org/Places.sqlite и тут: https://developer.mozilla.org/en-US/docs/Mozilla/Tech/Places/Database
Схема для лучшего ознакомления:
При создании профиля, создаётся папка с случайным набором символов, отделяющий себя
точкой, в начале названия профиля: [RANDOM.PROFILENAME]. Чтобы узнать полный путь к
профилю, Вам понадобиться ещё прочитать INI файл profiles.ini который находится в папке
%APPDATA%\Mozilla\Firefox\Profiles.
В файле profiles.ini несколько параметров:
[Profile0]
Name=default
IsRelative=1
Path=Profiles/s0ddpsc9.default
Default=1
Вас интересует именно ключ Path, который указывает на полный путь к конкретному профилю.
В Firefox есть ещё возможность сделать резервную копию вручную, в окне закладок,
пункт: Import and Backup > Restore... на выходе вы получите готовый JSON файл.
Ответ 2
bookmarks.json - это детали реализации, не стандартный формат. Поэтому у него нет
описания, и он может и будет меняться с доработками Firefox.
Есть более стабильный формат bookmarks.html, для которого есть куча реализаций и
даже, вроде как, документация (https://msdn.microsoft.com/en-us/library/aa753582%28v=vs.85%29.aspx),
но в котором не содержится все богатство информации из Firefox.
Если хотите связываться с JSON - разберитесь в текущем формате и обязательно добавьте
проверки, что формат соответствует тому, что вы ожидаете.
Вот тут есть краткое описание общей структуры (которая, в общем, и из примера понятна).
Истина в последней инстанции - это код, который этот файл пишет. Сейчас это PlacesUtils.promiseBookmarksTree().
По событию mousedown создаётся под указателем новый элемент со своим набором стилей,
в том числе собственный вид курсора.
$(document).ready(function() {
$("input").on("mousedown", function() {
$("body").append("")
});
$(document).on("mouseup", function() {
$("div.resizable").remove();
});
});
.resizable {
width: 100px;
height: 100px;
position: absolute;
top: 5px;
left: 5px;
cursor: move;
background: #eee;
}
В Chrome и IE всё работает как надо, а вот Firefox вредничает: курсор остаётся тем
же, что был до mousedown.
Ответы
Ответ 1
Судя по всему, FF показывает курсор input'а до тех пор, пока нажата кнопка.
Можно попробовать исправить так (но код с mouseup кривой - надеюсь, он тут для примера):
$(document).ready(function() {
$("input").on("mousedown", function() {
$(this).addClass("move-cursor")
$("body").append("")
});
$(document).on("mouseup", function() {
$(this).removeClass("move-cursor")
$("div.resizable").remove();
});
});
.resizable {
width: 100px;
height: 100px;
position: absolute;
top: 5px;
left: 5px;
cursor: move;
background: #eee;
}
.move-cursor {
cursor: move;
}
Не работает в Firefox, я знаю почему. Собственно,
вопрос: как это исправить? Календарь очень важен для моего сайта, с его помощью я получаю
дату.
Ответы
Ответ 1
Все просто. плохо поддерживается браузерами, так что на него
лучше не надеяться. Самым простым вариантом решения этой проблемы является уход от
календаря в сторону трех select'ов под день, месяц и год. Либо использовать одно из
множества готовых решений, например.
Между прочим, задача написания своего календаря на JS является так сказать, той программой,
которую должен попробовать написать каждый JS программист.
Ответ 2
Можно воспользоваться календарём на JavaScript. Например, Datepicker из jQueryUI.
Ещё можно посмотреть вариант здесь.
Я об этой функции в Firefox:
Существует ли какой-то html-тег для этого, или можно дать блоку какой-то класс для
обозначения "главного" текста на странице?
Проблема в том, что на каких-то страницах моего сайта браузер дает возможность просмотреть
статью в режиме чтения, а на каких-то нет.
Взять тот же Хабр, в этой статье кнопка появляется, а в этой нет.
Ответы
Ответ 1
Ответ прост - соблюдать семантику в HTML-разметке. Рекомендую прочитать про HTML5-теги.
Согласно его стандартам, основной текст на странице нужно помещать в Тег article. Как
это реализовано, можно посмотреть на примере моей последней работы. Там реализована
семантическая разметка и сайт отлично читается на мобильном Safari. На Windows не проверял,
но скорее всего там принцип работы идентичный.
Пишу плагин, который на текущей вкладке вызывает скрипт, который заполняет определенные
поля (имя, телефон, адрес и т.п.).
Как сделать сохранение этих значений?
В идеале: забить их в каком-то файле (например, в json) и при запуске скрипта для
вкладки вытаскивать их.
Цель -- один раз заполнить поля, чтобы плагин их находил, главное, чтобы после перезапуска
firefox'а они не потерлись.
Делаю для себя, но прописывать внутри кода эти значения не хочу -- отсутствие гибкости
и выкладывание личной инфы.
Потом бы добавил к плагину простой интерфейс для заполнения тех полей.
Ответы
Ответ 1
Simple Storage – доступный только для расширений FireFox.
Пример использования:
var ss = require("sdk/simple-storage");
ss.storage.myArray = [1, 1, 2, 3, 5, 8, 13];
ss.storage.myBoolean = true;
ss.storage.myNull = null;
ss.storage.myNumber = 3.1337;
ss.storage.myObject = { a: "foo", b: { c: true }, d: null };
ss.storage.myString = "O frabjous day!";
И надо бы что-то придумать с шифрованием данных.
Ответ 2
Есть еще один способ хранить настройки плагинов: simple-prefs
Нужно в package.json добавить поле preferences и в него добавить свои параметры.
После, эти параметры будут доступны в настроках плагина в about:addons. При изменении
настройки сохраняются, включая между запусками браузера.
UPDATE:
Плагин работает!
Исходник плагина: создание кнопки плагина и заполнение полей.
Значения полей берутся из настроек плагина.
Здравствуйте! Замечалось, что браузер Firefox изменяет код html, а именно добавляет
тег при использовании таблицы. Вопрос в том, стоит его самому писать или это
баг firefox? Вроде firefox добавляет этот тег к каждой таблице без исключения. Я просто
не вижу необходимости его добавления, разве что стили применить к нескольким ячейкам,
но просто сам тег без атрибутов... Думаю, вопрос этот волнует не только меня. Хоть
и мелочь но все же. Спасибо за ответы!
Ответы
Ответ 1
Тэг tbody добавляет не только ff, но и все другие браузеры (по крайней мере современные).
Данный тэг является обязательным. С оговоркой для таблиц без thead и tfoot, когда
все строки представляют собой одну группу, при этом браузеры сами создают tbody, может
быть во избежание (вдруг кто-то скриптом добавит футер, придется dom всей таблицы менять).
N.B. если в таблице у вас нет thead и tfoot, можете tbody не писать, браузер сам
за вас построит dom верно. если есть thead и tfoot, то обязательно и tbody прописывать.
в любом случае в dom'е будет tbody.
Ответ 2
Это все из-за W3-консорциума. Это они придумывают стандарты разметки, которые всякие
браузеры повторяют. А бедный HTML-гуру потом ломает голову, зачем вообще нужны теги
типа tbody, thead и tfoot. После таких измышлений многие профессионалы и вовсе отчаиваются
и начинают верстать сайты в Word'е — он честный, и творит легко через «Сохранить как
веб-страницу». Но это уже тонкости высшего пилотажа. А новички пусть и дальше страдают
валидностью и соблюдением стандартов.
Есть какой-либо способ через адресную строку firefox выполнить команду в bash-e?
Или запустить скрипт с параметрами.
Например, в адресной строке я ввожу:
run_script test1
и у меня запускается скрипт /usr/local/script.sh с параметром test1.
У меня уже получилось запустить скрипт file:///usr/local/script.sh и в настройках
firefox выбрать "все файлы *.sh открывать с помощью /bin/bash".
А вот как мне передать этому скрипту переменные?
Ответы
Ответ 1
можно воспользоваться каким-нибудь существующим незадействованным протоколом. список
— на странице about:preferences#applications (или через меню preferences → applications).
например, протоколом irc. в колонке action напротив него откройте список и выберите
use other, а в открывшемся диалоге укажите на созданный вами скрипт-обработчик.
теперь, если в браузере набрать irc://123&456?word/letter или «щёлкнуть» по ссылке
с этим адресом (вроде нажмите сюда), то именно
такую строку (irc://123&456?word/letter) ваш скрипт и получит первым параметром.
что дальше делать с этой строкой — уже на полное ваше усмотрение. можете, например,
в какой-нибудь файл записывать:
#!/bin/bash
echo "$1" >> /tmp/clicks.log
p.s. не забудьте биты исполняемости поставить на файл со скриптом:
$ chmod +x /путь/к/файлу
Ответ 2
Пишем простенький веб-эмулятор терминала на PHP. Посмотрите тут.
Ответ 3
Напиши обработчик протокола.
Вместо передачи напрямую башу передай эту ссылку в скрипт, где строку вида file:///script.sh?q=123?w
преобразуем в bash /script.sh -q 123 -w
Требуется перехватить траффик flash приложения запущенном в firefox. Как это сделать?
Вижу варианты:
Через прокси. Но по большому счету тут уже зашифрованный траффик и ничего с ним не
сделаешь.
Через сам firefox, через расширения или перехват функции перед шифрованием.
Ответы
Ответ 1
Можно добавить в Firefox свой сертификат и использовать sslsplit. Если флеш использует
свою базу сертификатов, то тогда нужно и туда.
Также обычный FireBug (или встроенный в Firefox аналог) часто показывает запросы
от флеша.
Ответ 2
Попробуйте использовать Charles, он выступает в роли локального прокси. При его установке
Charles автоматически предложит установить плагин для firefox.
Далее нужно установить корневой сертификат: меню Tools(Инструменты?) > Charles >
"Install Charles Root Certificate".
Так же в самой программе нужно будет добавить адрес сайта, трафик которого вы хотите
перехватывать: Proxy Settings, вкладка SSL.
Сам давно не пользовался, так что больше подсказать не могу, читайте документацию
на официальном сайте.
Нативная функция console.log ничего не выводит в firebug окне. При этом функция alert
работает как должна. При подробном выводе получаю следующую ошибку:
тестировалось на вот таком коде:
PS
Это происходит на любой кодировке.
версия ff:
версия firebug:
Ответы
Ответ 1
Поскольку Firebug в современных версиях Firefox больше не существует, а в нативном
отладчике все хорошо, полагаю вопрос больше неактуален.
Коллеги есть такой код. Кнопка для плеера play-pause.
let flag = true,
pause = document.getElementById('pause'),
play = document.getElementById('play');
document.getElementById('wrapper_svg_1').addEventListener('click', function() {
if (flag == true) {
pause.beginElement();
flag = false;
} else {
play.beginElement();
flag = true;
}
console.log(flag);
});
Особо рассказывать, что тут к чему, думаю не стоит.
Единственная проблема в том, что данная анимация на срабатывает в FF.
При клике как есть изначальная фигура так и остается.
Пол дня ковыряюсь не могу понять, что к чему и почему так.
Ответы
Ответ 1
Коллеги, оказалось все просто. Формат атрибута dur="n" у меня dur=".1s", что FF
и не нравиться. Формат атрибута dur="n" должен быть такой dur="0.1s" и все заработает
let flag = true,
pause = document.getElementById('pause'),
play = document.getElementById('play');
document.getElementById('wrapper_svg_1').addEventListener('click', function() {
if (flag == true) {
pause.beginElement();
flag = false;
} else {
play.beginElement();
flag = true;
}
console.log(flag);
});
This question already has answers here:
Как в Firefox убрать рамку для элементов таблицы в фокусе?
(3 ответа)
Closed 2 года назад.
Применяю такой способ:
* {
outline: 0 !important;
}
В Chrome все работает, а вот Firefox наотрез отказывается принимать этот код.
Ответы
Ответ 1
Данная проблема может возникнуть и на input'ах. При этом, блоки могут иметь еще и
лишний отступ. Поэтому надежнее будет написать так:
// Remove border and padding in Firefox
::-moz-focus-outer, ::-moz-focus-inner {
border: 0;
padding: 0;
}
Нужно делать коммит профиля Firefox, каждый раз после его закрытия. Как понять что
FF закрылся? Не буду я его в процессах постоянно мониторить. Потому что пользователь
может включить машину, а браузер не запустить и чем то другим заниматься или же наоборот
запускать Firefox по несколько раз в день.
Ответы
Ответ 1
Подход у вас неточный. Вместо того, чтобы детектить запущенный процесс Firefox --
лучше мониторьте, что Firefox держит открытым ваш профиль.
Вообще, профилей может быть несколько на компьютере, но запущенным будет только один.
Определить, что профиль Firefox in use можно по наличию или отсутствию файла:
"parent.lock" (Windows),
"lock" and ".parentlock" (Linux)
".parentlock" (Mac OS X)
Поскольку до компьютера с FF под linux доберусь только к вечеру, то сразу проверить
информацию не могу, постараюсь позже дополнить ответ.
И ещё. Пока искал инфу -- наткнулся на обсуждение того, что эта фича сломалась и
фикс есть только для Windows.
Так что пока просто обозначаю направление, куда копать -- а до полноценного решения
ещё далеко.
Updated. Эм. Смотрите, какая ситуация. На машине под Centos7 в профиле находится
ВСЕГДА файл parent.lock - а файл lock находится только когда профиль in use.
Похоже, что поломалось только под win.
Мне кажется, вам в первую очередь нужно попробовать на своей системе посмотреть,
как это у вас работает. Какой у вас дистрибутив Linux?
Ответ 2
например, можно заменить вызов программы вызовом «обёртки».
получаете путь к исполняемому файлу:
$ which программа
переименовываете его, добавив к имени, например, какой-нибудь суффикс:
$ sudo mv /полученный/путь /полученный/путь.realprogram
а под исходным именем помещаете скрипт-обёртку такого примерно вида:
#!/bin/bash
# запуск исходной программы:
/полученный/путь.realprogram
# ваш код, который будет выполняться после
# завершения работы исходной программы
не забыв добавить этому файлу биты исполнимости:
$ sudo chmod +x /полученный/путь
иногда возникает необходимость работать из браузера (например, firefox) как-будто
бы из другой точки сети (куда есть доступ по протоколу ssh).
например, нужно работать с веб-сайтом, который доступен только в локальной сети,
из внешнего мира. при этом есть ssh-доступ к машине в этой локальной сети.
или при доступе к веб-сайту требуется «прикинуться» работающим из другой страны (и
есть ssh-доступ к серверу в этой стране).
или в локальной сети вообще нет доступа в интернет, но есть ssh-доступ к машине,
на которой соединения с интернетом разрешены.
как всё это осуществить? как настроить браузер? как запускать ssh-клиент?
Ответы
Ответ 1
предположим, что вы подключаетесь к некоему серверу по протоколу ssh такой командой:
$ ssh user@server
тогда вам потребуется:
запустить ssh-клиент с опцией -D порт, тогда программа ssh будет слушать указанный
порт на локальном компьютере и (пока работает) все обращения к этому порту по протоколу
socks будет ретранслировать на сервер:
$ ssh -D 1122 user@server
номер порта здесь произвольный, но, конечно, должен быть больше 1024 и меньше максимального
номера порта (скорее всего, в вашей системе это 65536), и, конечно, не должен использоваться
каким-нибудь другим локальным процессом.
в браузере firefox на странице about:config измените следующие параметры:
network.proxy.type = 1 (0 — отключить proxy)
network.proxy.socks = 127.0.0.1
network.proxy.socks_port = 1122 (тот порт, что вы указали выше)
network.proxy.socks_remote_dns = true (dns-запросы тоже будут отправляться через туннель)
вышеперечисленные настройки можно сделать и с помощью «мышки» — на странице "preferences":
"advanced" → "network" → "settings".
для отключения проксирования достаточно поменять один параметр — network.proxy.type = 0.
вероятно, достаточно удобным будет завести новый профиль в firefox с этими настройками,
чтобы они не мешали «обычной» работе. запустить firefox, чтобы он показал диалог выбора
профилей, можно примерно так:
$ firefox --no-remote -P
можно и сразу запускать нужный профиль. например, если вы назвали профиль proxy:
$ firefox --no-remote -P proxy
скорее всего, подобные настройки можно осуществить и в других браузерах. обратитесь
к документации вашего браузера по поводу использования socks-proxy.
При клике на одну из кнопок на сайте исчезает другая кнопка. (display:none)
Так не должно быть, и не могу найти код где это делается!
В консоли Google Chrome и Mozzila Firefox не нашел...
Проект большой. В поиске по файлам искал... ничего...магия....
Ответы
Ответ 1
В Google Chrome это делается очень просто:
Открываете Developer Tools(F12), инструментом выбора(CTRL+SHIFT+C) находите нужны
элемент, и в контекстом меню этого элемента в дереве элементов выбираете функцию "Break On", c необходимым условием - при изменении подэлементов, изменении атрибутов или удалении элемента.
При соответствующем изменении, отладчик JavaScript остановится на строчке кода, которая это изменение вызвала.
Ответ 2
Для полноты картины, то же самое легко делается и в Firefox с плагином Firebug.
Та же комбинация клавиш: F12 открывает Firebug, Ctrl-Shift-C или инструмент выбора
позволяют найти элемент в дереве, правая кнопка мыши на элемент открывает меню, в котором можно выбрать остановку на изменении:
Сейчас у меня Mozilla Developer Edition 42.0a2 (2015-09-08), не знаю с какой версии появились эти свойства, но все же.
layers.acceleration.draw-fps добавляет три цифровых блока в левый верхний угол окна. Первый блок отвечает за fps, это я понял, а что показывают остальные 2, я не смог пока сообразить. Что они значат?
layers.draw-borders позволяет браузеру выделять слои, грузящиеся в GPU, в документе, на сколько я знаю. Браузер выделяет их зеленым цветом, однако, бывают случаи, порой замечал на других сайтах, довольно редко правда, когда он это делает синим или даже красным цветом, что это значит?
Ответ
1) layers.acceleration.draw-fps выводит 3 числа: compositions/sec, transactions/sec, fill ratio % Чтобы понять, что они означают, надо разбираться в архитектуре графической подсистемы Firefox. Не могу сказать, что я эксперт в этой области, но в частности из Gecko overview: compositing и вот этих двух постов: 1, 2, у меня сложилось такое понимание:
Все окно/страница разбивается на "слои" (layers): блоки, нарисовав которые друг поверх друга, можно получить искомое изображение. Например, "прикрепленная" фоновая картинка, текст, изображение в
Задача: запустить браузер с подключение через прокси для подключения к которому необходимо проходить аутентификацию.
Для установки прокси в браузере вручную, прописываю адрес и порт в настройках соединения браузера. После этого, при первом доступе к любому серверу в браузере вылезает диалоговое окно для прохождения авторизации (basic authorization). После ее прохождения все запросы проходят через прокси. В селениуме пробовал делать так: org.openqa.selenium.Proxy proxy = new org.openqa.selenium.Proxy();
proxy.setHttpProxy(":@:");
proxy.setSslProxy(":@:");
DesiredCapabilities capabilities = DesiredCapabilities.firefox();
capabilities.setCapability(CapabilityType.PROXY, proxy);
WebDriver driver = new FirefoxDriver(capabilities);
В этом случае в конфигурации подключения браузера на место адреса прокси устанавливается , а порт дэфолтный ( ноль ). Если дописать http://, то вместо адреса вставляется http, а порт ноль.
И еще, пробовал так: org.openqa.selenium.Proxy proxy = new org.openqa.selenium.Proxy();
proxy.setHttpProxy(":");
proxy.setSslProxy(":");
DesiredCapabilities capabilities = DesiredCapabilities.firefox();
capabilities.setCapability(CapabilityType.PROXY, proxy);
WebDriver driver = new FirefoxDriver(capabilities);
В этом случае адрес и порт прописываются правильно и после запуска браузера (на строке WebDriver driver = new FirefoxDriver(capabilities);) появляется диалоговое окно с текстом Прокси «moz-proxy://:» запрашивает имя пользователя и пароль. Сайт сообщает: «proxy» и полями для ввода логина и пароля, выполнение программы приостанавливается, что не дает возможность воспользоваться созданным объектом driver для переключения на окно и ввести логин и пароль (driver.switchTo().alert()....).
Также нагуглил вариант: org.openqa.selenium.Proxy proxy = new org.openqa.selenium.Proxy();
proxy.setHttpProxy(":");
proxy.setSslProxy(":");
proxy.setSocksUsername("");
proxy.setSocksPassword("");
DesiredCapabilities capabilities = DesiredCapabilities.firefox();
capabilities.setCapability(CapabilityType.PROXY, proxy);
WebDriver driver = new FirefoxDriver(capabilities);
Но результат такой-же как и во втором случае.
Работать должно как минимум в Firefox, а в идеале еще и в PhantomJS. В принципе, не будет лишней поддержка Chrome, но это не обязательно.
Update Неужели никто не сталкивался с таким? Я пробовал использовать еще такой вариант: DesiredCapabilities capabilities = new DesiredCapabilities(); // DesiredCapabilities.firefox();
FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("network.proxy.type", 1);
profile.setPreference("signon.autologin.proxy" , true);
profile.setPreference("network.websocket.enabled", false);
profile.setPreference("network.proxy.share_proxy_settings", false);
profile.setPreference("network.automatic-ntlm-auth.allow-proxies", false);
profile.setPreference("network.http.phishy-userpass-length", 255);
profile.setPreference("network.auth.use-sspi", false);
profile.setPreference("network.proxy.http", "");
profile.setPreference("network.proxy.http_port", );
profile.setPreference("network.proxy.ssl", "");
profile.setPreference("network.proxy.ssl_port", );
capabilities.setCapability(FirefoxDriver.PROFILE, profile);
org.openqa.selenium.Proxy proxy = new org.openqa.selenium.Proxy();
proxy.setProxyType(ProxyType.MANUAL);
proxy.setSocksUsername("");
proxy.setSocksPassword("");
capabilities.setCapability(CapabilityType.PROXY, proxy);
WebDriver driver = new FirefoxDriver(capabilities);
driver.get("http://2ip.ru");
Если устанавливать конфигурацию прокси через профайл фаерфокса ( profile.setPreference(...) ), то окно для авторизации через прокси появляется немного раньше окна браузера (браузер запускается примерно за 1 секунду, а окно для авторизации появляется примерно на пол секунды раньше) и при этом, в отличии от вариантов реализации из предыдущего сообщения, не блокирует главное окно (которое запускается/отображается немножко позже). Также в этом варианте выполнение программы не приостанавливается на строке создания драйвера (new FirefoxDriver(capabilities);). Программа приостанавливается на строке driver.get("http://2ip.ru"); , браузер при этом ожидает ответ от 2ip.ru, до тех пор пока я не введу вручную данные для авторизации прокси, если авторизация не удалась, то вместо запрошенной страницы получаю сообщение - "Прокси-сервер отказывается принимать соединения". Вопрос: как можно получить доступ к окну авторизации для дальнейшего ввода логина и пародя или как пройти авторизацию на прокси сервере не выводя окно для авторизации ( примерно как я пробовал: proxy.setSocksUsername(""); proxy.setSocksPassword("" ); )?
Ответ
Решил через AutoItX4Java: private void mozProxyAuth(String login, String password) {
String JACOB_DLL_TO_USE = System.getProperty("sun.arch.data.model").contains("32") ? "jacob-1.18-x86.dll" : "jacob-1.18-x64.dll";
File file = new File(System.getProperty("user.dir"), JACOB_DLL_TO_USE);
System.setProperty(LibraryLoader.JACOB_DLL_PATH, file.getAbsolutePath());
AutoItX x = new AutoItX();
if (x.winWait("Требуется аутентификация", null, 10)) {
x.winActivate("Требуется аутентификация");
x.send(login + "{TAB}" + password + "{ENTER}", false);
}
}
Наткнулся на проблему с отображением списка в FF (в Chrome/IE работает нормально).
Проблема в том что при overflow: auto в FF скорллбар съедает самый длинный элемент в списке, как будто накладывает скроллбар поверх списка а не прикрепляет его сбоку как в IE и Chrome. overflow-y: scroll решает проблему, но в таком случае скроллбар будет отображаться постоянно, даже когда он функционально не нужен, а это в моем случае неприемлемо. white-space: nowrap тоже нужен, так как по требованию нужно отображать элементы одной строкой. Ширину div элемента тоже желательно оставить на width: auto
div {
display: block;
min-width: 40px;
width: auto;
position: absolute;
top: 50px;
left: 100px;
background: #fff;
z-index: 102;
max-height: 100px;
overflow-y: auto;
overflow-x: visible;
border-radius: 5px;
box-shadow: 0px 5px 60px -7px #808e95;
padding: 20px 10px;
margin: 5px 0 0;
}
ul {
overflow: hidden;
white-space: nowrap;
list-style: none;
margin: 0;
padding: 0;
}
Element
Element
Element
Element
Element
Element
REALLY BIG ELEMENT INSERTED HERE!
Element
Element
Element
Element
Element
Element
В общем можно как-то это решить не прибегая к JS костылям?
Ответ
Можно обойти если обернуть текст в span и задать padding-left равный ширине Firefox скроллбара (примерно 20px). Но проблема в том, что в остальных браузерах этот padding-left будет отображаться рядом со скроллбаром, поэтому решение на любителя но зато без лишних вычислений и JS костылей :)
div {
width: auto;
position: absolute;
top: 100px;
left: 100px;
background: #fff;
max-height: 100px;
overflow-y: auto;
overflow-x: visible;
border-radius: 5px;
box-shadow: 0px 5px 60px -7px #808e95;
}
ul {
overflow: hidden;
margin: 0;
padding: 0;
}
span{
padding-right: 22px;
display: inline-block;
white-space: nowrap;
}
Добрый день! Подскажите, почему нможет не работать AJAX скрипт в firefox?
Скрипт отвечает за отправку данных формы(добавление товара в корзину), в Опере и Хроме все нормально. А в firefox форма перенаправляет на ссылку в action из за чего я получаю 404 и товар в корзину не попадает. $('.main-wrap').on('submit','form#add-product',function() {
event.preventDefault();
var a = null,
e = null,
t = $(this),
n = t.find('button[type="submit"]'),
r = t.find('input[name="variant"]:checked'),
s = t.find('select[name="variant"]'),
i = t.find('select[name="size"]'),
u = t.find('input[name="size"]:checked'),
l = t.find('input[name="amount"]');
console.log(a = r.val());
console.log(e = u.val());
console.log(l.val());
r.size() > 0 && (a = r.val()),
l.size() > 0 && (amount = l.val()),
s.size() > 0 && (a = s.val()),
u.size() > 0 && u.val() > 0 && (e = u.val()),
i.size() > 0 && (e = i.val()), 0 != e ? $.ajax({
url: "ajax/cart.php",
data: {
variant: a,
size: e,
amount: amount
},
dataType: "json",
success: function(a) {
// $(".error-message").hasClass("size-error") && $(".error-message").removeClass("size-error"),
console.log(a['c']);
console.log(a['p']);
$(".cart-btn").html(a['c']).addClass('cart--active');
$('.popup__body').html(a['p']);
}
}) : $(".error-message").addClass("size-error")
});
Ответ
В Firefox нет глобального объекта event. К счастью, обработчики событий jQuery получают его первым параметром во всех браузерах. $('.main-wrap').on('submit','form#add-product',function(event) {
event.preventDefault();
...
Хочу отпарсить JSON с сохраненными закладками из Firefox, но там очень много параметров, о назначении которых можно только догадываться (в частности, типы папок). А я хочу сделать нормальный импорт закладок из FF в свой софт (не костыльный, а в соответствии с документацией, которую я, к сожалению, на нашел). Есть ли вообще такое? Или может кто разбирался в этом вопросе и написал свою инструкцию? :) P.S. На https://developer.mozilla.org/ не нашел. Есть некоторые похожие вопросы, но по сути не то: https://stackoverflow.com/questions/904522/output-firefox-json-data
Ответ
Firefox хранит закладки, историю загрузок и посещений в базе данных SQLite, в файле places.sqlite, который находится в папке %APPDATA%\Mozilla\Firefox\Profiles\[RANDOM.PROFILENAME] В своей программе Вы можете открыть эту базу и прочесть любые интересующие данные (в том числе и перевести их в формат JSON). Есть небольшое разъяснение по структуре тут: http://kb.mozillazine.org/Places.sqlite и тут: https://developer.mozilla.org/en-US/docs/Mozilla/Tech/Places/Database Схема для лучшего ознакомления:
При создании профиля, создаётся папка с случайным набором символов, отделяющий себя точкой, в начале названия профиля: [RANDOM.PROFILENAME]. Чтобы узнать полный путь к профилю, Вам понадобиться ещё прочитать INI файл profiles.ini который находится в папке %APPDATA%\Mozilla\Firefox\Profiles В файле profiles.ini несколько параметров: [Profile0]
Name=default
IsRelative=1
Path=Profiles/s0ddpsc9.default
Default=1
Вас интересует именно ключ Path, который указывает на полный путь к конкретному профилю. В Firefox есть ещё возможность сделать резервную копию вручную, в окне закладок, пункт: Import and Backup > Restore... на выходе вы получите готовый JSON файл.