Почему 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, но я считаю, что первое решение - это позднее связывание (зависимости разрешаются во время выполнения), тогда как второе решение - это привязка во время компиляции, и это зависит от "хорошей" предопределенной библиотеки, и это не случай с мштмл.

Другие вопросы по тегам