diff --git a/comtypes/test/test_QueryService.py b/comtypes/test/test_QueryService.py
index c15a4363..debad853 100644
--- a/comtypes/test/test_QueryService.py
+++ b/comtypes/test/test_QueryService.py
@@ -1,30 +1,60 @@
+import contextlib
+import time
import unittest
from ctypes import POINTER
import comtypes
+from comtypes import GUID
from comtypes.client import CreateObject, GetModule
-GetModule("oleacc.dll")
-from comtypes.gen.Accessibility import IAccessible
+with contextlib.redirect_stdout(None): # supress warnings
+ GetModule("mshtml.tlb")
+import comtypes.gen.MSHTML as mshtml
+SID_SHTMLEditServices = GUID("{3050F7F9-98B5-11CF-BB82-00AA00BDCE0B}")
-@unittest.skip(
- "This IE test is not working. We need to move it to using some other win32 API."
-)
-class TestCase(unittest.TestCase):
- def setUp(self):
- self.ie = CreateObject("InternetExplorer.application")
-
- def tearDown(self):
- self.ie.Quit()
- del self.ie
+class TestCase(unittest.TestCase):
def test(self):
- ie = self.ie
- ie.navigate2("about:blank", 0)
- sp = ie.Document.Body.QueryInterface(comtypes.IServiceProvider)
- pacc = sp.QueryService(IAccessible._iid_, IAccessible)
- self.assertEqual(type(pacc), POINTER(IAccessible))
+ doc = CreateObject(mshtml.HTMLDocument, interface=mshtml.IHTMLDocument2)
+ doc.designMode = "On"
+ doc.write("
Hello
")
+ doc.close()
+ while doc.readyState != "complete":
+ time.sleep(0.01)
+ sp = doc.QueryInterface(comtypes.IServiceProvider)
+ # This behavior is described in Microsoft documentation:
+ # https://learn.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa704048(v=vs.85)
+ es = sp.QueryService(SID_SHTMLEditServices, mshtml.IHTMLEditServices)
+ self.assertIsInstance(es, POINTER(mshtml.IHTMLEditServices))
+ mc = doc.QueryInterface(mshtml.IMarkupContainer)
+ ss = es.GetSelectionServices(mc)
+ # QueryInterface for `IHTMLDocument3` to access `getElementById`.
+ element = doc.QueryInterface(mshtml.IHTMLDocument3).getElementById("test")
+ self.assertEqual(element.innerHTML, "Hello")
+ # MarkupPointer related tests:
+ ms = doc.QueryInterface(mshtml.IMarkupServices)
+ p_start = ms.CreateMarkupPointer()
+ p_end = ms.CreateMarkupPointer()
+ # QueryInterface for `IHTMLBodyElement` to access `createTextRange`.
+ rng = doc.body.QueryInterface(mshtml.IHTMLBodyElement).createTextRange()
+ rng.moveToElementText(element)
+ ms.MovePointersToRange(rng, p_start, p_end)
+ self.assertTrue(p_start.IsLeftOf(p_end))
+ self.assertTrue(p_end.IsRightOf(p_start))
+ self.assertFalse(p_start.IsEqualTo(p_end))
+ seg = ss.AddSegment(p_start, p_end)
+ q_start = ms.CreateMarkupPointer()
+ q_end = ms.CreateMarkupPointer()
+ self.assertFalse(p_start.IsEqualTo(q_start))
+ self.assertFalse(p_end.IsEqualTo(q_end))
+ seg.GetPointers(q_start, q_end)
+ self.assertTrue(p_start.IsEqualTo(q_start))
+ self.assertTrue(p_end.IsEqualTo(q_end))
+ ss.RemoveSegment(seg)
+ # Verify state changes of `p_start` and `p_end`.
+ p_start.MoveToPointer(p_end)
+ self.assertTrue(p_start.IsEqualTo(p_end))
if __name__ == "__main__":