Почему MSHTML для.Net не имеет querySelector и querySelectorAll, или где они?
Я хочу использовать MSHTML [1] для доступа к DOM в IE, но я только что обнаружил, что в классах документов HTML отсутствуют методы querySelector и querySelectorAll, которые в противном случае будут очень полезны для получения элементов в документе с помощью селекторов CSS.
Единственный обходной путь, о котором я сейчас могу подумать, - это сделать все, выполняя сценарий, но это ужасно.
Есть ли версия MSHTML, которая имеет два метода (querySelector и querySelectorAll)? Существуют ли какие-либо другие библиотеки (надеюсь, официальные библиотеки.Net от Microsoft), где доступны эти два метода или их эквиваленты?
[1]% ProgramFiles (x86)% \ Microsoft.NET \ Первичные сборки взаимодействия \Microsoft.mshtml.dll
2 ответа
Метод и друзья querySelector() живы и здоровы в MSHtml и IE DOM, проблема в том, что PIA, которую большинство программистов имеют на своей машине, сильно устарела. Тот, который зарегистрирован в GAC на моей машине, имеет номер версии 7.0.3300.0, который датируется 2002 годом.
Для этого есть обходной путь, вы можете сгенерировать свою собственную библиотеку взаимодействий и избежать ее в GAC. Хитрость заключается в том, чтобы преднамеренно генерировать несоответствие, создавая сборку взаимодействия без строгого имени, чтобы она не могла совпадать с таковой в GAC. Обязательно делайте это только на VS2010 или новее, вы хотите воспользоваться функцией Embed Interop Types.
Запустите командную строку Visual Studio и перейдите в каталог проекта. И выполните эту команду:
Tlbimp c:\windows\system32\mshtml.tlb
Некоторое время он будет разворачиваться, библиотека типов большая и выдает несколько непристойных предупреждений, которые вы можете игнорировать. Вернитесь в VS, удалите существующую ссылку MSHTML и используйте Добавить ссылку, вкладку Обзор. Выберите файл MSHTML.dll, созданный Tlbimp.
Я не могу гарантировать, что у вас не возникнет никаких проблем, вам нужно помнить, что у вашего пользователя должна быть обновленная версия IE, предпочтительно та, которая соответствует вашей. Если вы используете метод в интерфейсе, которого нет в более старой версии IE, то он будет довольно неприятным, скорее всего, возникнет AccessViolationException.
Вчера я заметил ту же проблему, я нашел решение.
Следующий пример кода работает для меня:
Document.querySelectorAll("#navbar_search>a").item(0).click();
Если я пытаюсь сделать "то же самое", но с этим кодом, это не удается:
HTMLDocument doc;
doc = ie.Document;
doc.querySelectorAll("#navbar_search>a").item(0).click();
Я не эксперт COM, но я считаю, что первое решение - это позднее связывание (зависимости разрешаются во время выполнения), тогда как второе решение - это привязка во время компиляции, и это зависит от "хорошей" предопределенной библиотеки, и это не случай с мштмл.