Python bindings for Apple's WebKit and JavaScriptCore frameworks on macOS, enabling web browser functionality and JavaScript execution in Python applications
—
Complete Document Object Model classes for programmatic web content manipulation. Provides access to HTML elements, events, CSS styles, and document structure through Python bindings to WebKit's DOM implementation.
Root document object providing access to the entire DOM tree and document-level operations.
class DOMDocument:
# Element creation and access
def createElement_(self, tagName: str) -> DOMElement: ...
def createTextNode_(self, data: str) -> DOMText: ...
def createComment_(self, data: str) -> DOMComment: ...
def createDocumentFragment(self) -> DOMDocumentFragment: ...
def getElementById_(self, elementId: str) -> DOMElement: ...
def getElementsByTagName_(self, tagName: str) -> DOMNodeList: ...
def getElementsByClassName_(self, className: str) -> DOMNodeList: ...
# Document properties
@property
def documentElement(self) -> DOMElement: ...
@property
def body(self) -> DOMHTMLElement: ...
@property
def head(self) -> DOMHTMLElement: ...
@property
def title(self) -> str: ...
@property
def URL(self) -> str: ...
@property
def domain(self) -> str: ...
@property
def cookie(self) -> str: ...
@property
def lastModified(self) -> str: ...
@property
def characterSet(self) -> str: ...
@property
def contentType(self) -> str: ...
@property
def doctype(self) -> DOMDocumentType: ...
# Document manipulation
def importNode_deep_(self, importedNode: DOMNode, deep: bool) -> DOMNode: ...
def adoptNode_(self, source: DOMNode) -> DOMNode: ...
# Focus and editing
def hasFocus(self) -> bool: ...
def execCommand_(self, command: str) -> bool: ...
def execCommand_userInterface_value_(self, command: str, userInterface: bool, value: str) -> bool: ...
def queryCommandEnabled_(self, command: str) -> bool: ...
def queryCommandIndeterm_(self, command: str) -> bool: ...
def queryCommandState_(self, command: str) -> bool: ...
def queryCommandSupported_(self, command: str) -> bool: ...
def queryCommandValue_(self, command: str) -> str: ...
# Ranges and selection
def createRange(self) -> DOMRange: ...
def getSelection(self) -> DOMSelection: ...
# Event handling
def addEventListener_listener_useCapture_(self, type: str, listener: callable, useCapture: bool): ...
def removeEventListener_listener_useCapture_(self, type: str, listener: callable, useCapture: bool): ...
# CSS and styles
def getComputedStyle_pseudoElement_(self, element: DOMElement, pseudoElement: str) -> DOMCSSStyleDeclaration: ...
def getMatchedCSSRules_pseudoElement_authorOnly_(self, element: DOMElement, pseudoElement: str, authorOnly: bool) -> DOMCSSRuleList: ...HTML-specific document functionality extending DOMDocument.
class DOMHTMLDocument(DOMDocument):
def open(self): ...
def close(self): ...
def write_(self, text: str): ...
def writeln_(self, text: str): ...
@property
def images(self) -> DOMHTMLCollection: ...
@property
def applets(self) -> DOMHTMLCollection: ...
@property
def links(self) -> DOMHTMLCollection: ...
@property
def forms(self) -> DOMHTMLCollection: ...
@property
def anchors(self) -> DOMHTMLCollection: ...
@property
def embeds(self) -> DOMHTMLCollection: ...
@property
def plugins(self) -> DOMHTMLCollection: ...
@property
def scripts(self) -> DOMHTMLCollection: ...
def hasFocus(self) -> bool: ...Base element class for all HTML and XML elements.
class DOMElement(DOMNode):
# Attribute access
def getAttribute_(self, name: str) -> str: ...
def setAttribute_value_(self, name: str, value: str): ...
def removeAttribute_(self, name: str): ...
def hasAttribute_(self, name: str) -> bool: ...
def getAttributeNode_(self, name: str) -> DOMAttr: ...
def setAttributeNode_(self, newAttr: DOMAttr) -> DOMAttr: ...
def removeAttributeNode_(self, oldAttr: DOMAttr) -> DOMAttr: ...
# Namespaced attributes
def getAttributeNS_localName_(self, namespaceURI: str, localName: str) -> str: ...
def setAttributeNS_qualifiedName_value_(self, namespaceURI: str, qualifiedName: str, value: str): ...
def removeAttributeNS_localName_(self, namespaceURI: str, localName: str): ...
def hasAttributeNS_localName_(self, namespaceURI: str, localName: str) -> bool: ...
def getAttributeNodeNS_localName_(self, namespaceURI: str, localName: str) -> DOMAttr: ...
def setAttributeNodeNS_(self, newAttr: DOMAttr) -> DOMAttr: ...
# Element properties
@property
def tagName(self) -> str: ...
@property
def id(self) -> str: ...
@property
def className(self) -> str: ...
@property
def innerHTML(self) -> str: ...
@property
def outerHTML(self) -> str: ...
@property
def innerText(self) -> str: ...
@property
def outerText(self) -> str: ...
# Element traversal
def getElementsByTagName_(self, name: str) -> DOMNodeList: ...
def getElementsByTagNameNS_localName_(self, namespaceURI: str, localName: str) -> DOMNodeList: ...
def getElementsByClassName_(self, name: str) -> DOMNodeList: ...
# Element positioning and size
@property
def clientWidth(self) -> int: ...
@property
def clientHeight(self) -> int: ...
@property
def scrollWidth(self) -> int: ...
@property
def scrollHeight(self) -> int: ...
@property
def scrollLeft(self) -> int: ...
@property
def scrollTop(self) -> int: ...
@property
def offsetWidth(self) -> int: ...
@property
def offsetHeight(self) -> int: ...
@property
def offsetLeft(self) -> int: ...
@property
def offsetTop(self) -> int: ...
@property
def offsetParent(self) -> DOMElement: ...
# Scrolling
def scrollIntoView_(self, alignToTop: bool): ...
def scrollIntoViewIfNeeded_(self, centerIfNeeded: bool): ...
def scrollByLines_(self, lines: int): ...
def scrollByPages_(self, pages: int): ...
# Element queries
def querySelector_(self, selectors: str) -> DOMElement: ...
def querySelectorAll_(self, selectors: str) -> DOMNodeList: ...
# Element relationships
def contains_(self, element: DOMElement) -> bool: ...
def webkitMatchesSelector_(self, selectors: str) -> bool: ...
# Style access
@property
def style(self) -> DOMCSSStyleDeclaration: ...Base class for HTML elements with HTML-specific functionality.
class DOMHTMLElement(DOMElement):
@property
def title(self) -> str: ...
@property
def lang(self) -> str: ...
@property
def dir(self) -> str: ...
@property
def tabIndex(self) -> int: ...
@property
def accessKey(self) -> str: ...
@property
def contentEditable(self) -> str: ...
def isContentEditable(self) -> bool: ...
@property
def draggable(self) -> bool: ...
@property
def spellcheck(self) -> bool: ...
@property
def hidden(self) -> bool: ...
# Focus management
def focus(self): ...
def blur(self): ...
def click(self): ...HTML input element with form-specific functionality.
class DOMHTMLInputElement(DOMHTMLElement):
@property
def type(self) -> str: ...
@property
def name(self) -> str: ...
@property
def value(self) -> str: ...
@property
def checked(self) -> bool: ...
@property
def defaultChecked(self) -> bool: ...
@property
def disabled(self) -> bool: ...
@property
def readOnly(self) -> bool: ...
@property
def maxLength(self) -> int: ...
@property
def size(self) -> int: ...
@property
def alt(self) -> str: ...
@property
def src(self) -> str: ...
@property
def useMap(self) -> str: ...
@property
def accept(self) -> str: ...
@property
def accessKey(self) -> str: ...
@property
def align(self) -> str: ...
@property
def defaultValue(self) -> str: ...
@property
def form(self) -> DOMHTMLFormElement: ...
@property
def selectionStart(self) -> int: ...
@property
def selectionEnd(self) -> int: ...
@property
def autofocus(self) -> bool: ...
@property
def multiple(self) -> bool: ...
@property
def placeholder(self) -> str: ...
@property
def required(self) -> bool: ...
@property
def autocomplete(self) -> str: ...
@property
def files(self) -> DOMFileList: ...
def select(self): ...
def setSelectionRange_end_(self, start: int, end: int): ...
def click(self): ...HTML select element for dropdown lists.
class DOMHTMLSelectElement(DOMHTMLElement):
@property
def type(self) -> str: ...
@property
def selectedIndex(self) -> int: ...
@property
def value(self) -> str: ...
@property
def length(self) -> int: ...
@property
def form(self) -> DOMHTMLFormElement: ...
@property
def options(self) -> DOMHTMLOptionsCollection: ...
@property
def disabled(self) -> bool: ...
@property
def multiple(self) -> bool: ...
@property
def name(self) -> str: ...
@property
def size(self) -> int: ...
@property
def tabIndex(self) -> int: ...
@property
def autofocus(self) -> bool: ...
@property
def required(self) -> bool: ...
def add_before_(self, element: DOMHTMLElement, before: DOMHTMLElement): ...
def remove_(self, index: int): ...
def namedItem_(self, name: str) -> DOMNode: ...
def item_(self, index: int) -> DOMNode: ...HTML option element for select lists.
class DOMHTMLOptionElement(DOMHTMLElement):
@property
def form(self) -> DOMHTMLFormElement: ...
@property
def defaultSelected(self) -> bool: ...
@property
def text(self) -> str: ...
@property
def index(self) -> int: ...
@property
def disabled(self) -> bool: ...
@property
def label(self) -> str: ...
@property
def selected(self) -> bool: ...
@property
def value(self) -> str: ...HTML textarea element for multi-line text input.
class DOMHTMLTextAreaElement(DOMHTMLElement):
@property
def defaultValue(self) -> str: ...
@property
def form(self) -> DOMHTMLFormElement: ...
@property
def accessKey(self) -> str: ...
@property
def cols(self) -> int: ...
@property
def disabled(self) -> bool: ...
@property
def name(self) -> str: ...
@property
def readOnly(self) -> bool: ...
@property
def rows(self) -> int: ...
@property
def tabIndex(self) -> int: ...
@property
def type(self) -> str: ...
@property
def value(self) -> str: ...
@property
def selectionStart(self) -> int: ...
@property
def selectionEnd(self) -> int: ...
@property
def textLength(self) -> int: ...
@property
def autofocus(self) -> bool: ...
@property
def placeholder(self) -> str: ...
@property
def required(self) -> bool: ...
@property
def wrap(self) -> str: ...
def select(self): ...
def setSelectionRange_end_(self, start: int, end: int): ...HTML button element.
class DOMHTMLButtonElement(DOMHTMLElement):
@property
def form(self) -> DOMHTMLFormElement: ...
@property
def accessKey(self) -> str: ...
@property
def disabled(self) -> bool: ...
@property
def name(self) -> str: ...
@property
def tabIndex(self) -> int: ...
@property
def type(self) -> str: ...
@property
def value(self) -> str: ...
@property
def autofocus(self) -> bool: ...
def willValidate(self) -> bool: ...
def setWillValidate_(self, willValidate: bool): ...HTML image element.
class DOMHTMLImageElement(DOMHTMLElement):
@property
def name(self) -> str: ...
@property
def align(self) -> str: ...
@property
def alt(self) -> str: ...
@property
def border(self) -> str: ...
@property
def height(self) -> int: ...
@property
def hspace(self) -> int: ...
@property
def isMap(self) -> bool: ...
@property
def longDesc(self) -> str: ...
@property
def src(self) -> str: ...
@property
def useMap(self) -> str: ...
@property
def vspace(self) -> int: ...
@property
def width(self) -> int: ...
@property
def complete(self) -> bool: ...
@property
def lowsrc(self) -> str: ...
@property
def naturalHeight(self) -> int: ...
@property
def naturalWidth(self) -> int: ...
@property
def x(self) -> int: ...
@property
def y(self) -> int: ...HTML link element.
class DOMHTMLLinkElement(DOMHTMLElement):
@property
def disabled(self) -> bool: ...
@property
def charset(self) -> str: ...
@property
def href(self) -> str: ...
@property
def hreflang(self) -> str: ...
@property
def media(self) -> str: ...
@property
def rel(self) -> str: ...
@property
def rev(self) -> str: ...
@property
def target(self) -> str: ...
@property
def type(self) -> str: ...
@property
def sheet(self) -> DOMStyleSheet: ...Base node class for all DOM objects.
class DOMNode:
# Node types
ELEMENT_NODE = 1
ATTRIBUTE_NODE = 2
TEXT_NODE = 3
CDATA_SECTION_NODE = 4
ENTITY_REFERENCE_NODE = 5
ENTITY_NODE = 6
PROCESSING_INSTRUCTION_NODE = 7
COMMENT_NODE = 8
DOCUMENT_NODE = 9
DOCUMENT_TYPE_NODE = 10
DOCUMENT_FRAGMENT_NODE = 11
NOTATION_NODE = 12
# Node properties
@property
def nodeName(self) -> str: ...
@property
def nodeValue(self) -> str: ...
@property
def nodeType(self) -> int: ...
@property
def parentNode(self) -> DOMNode: ...
@property
def childNodes(self) -> DOMNodeList: ...
@property
def firstChild(self) -> DOMNode: ...
@property
def lastChild(self) -> DOMNode: ...
@property
def previousSibling(self) -> DOMNode: ...
@property
def nextSibling(self) -> DOMNode: ...
@property
def attributes(self) -> DOMNamedNodeMap: ...
@property
def ownerDocument(self) -> DOMDocument: ...
@property
def namespaceURI(self) -> str: ...
@property
def prefix(self) -> str: ...
@property
def localName(self) -> str: ...
@property
def textContent(self) -> str: ...
# Node manipulation
def insertBefore_refChild_(self, newChild: DOMNode, refChild: DOMNode) -> DOMNode: ...
def replaceChild_oldChild_(self, newChild: DOMNode, oldChild: DOMNode) -> DOMNode: ...
def removeChild_(self, oldChild: DOMNode) -> DOMNode: ...
def appendChild_(self, newChild: DOMNode) -> DOMNode: ...
def hasChildNodes(self) -> bool: ...
def cloneNode_(self, deep: bool) -> DOMNode: ...
def normalize(self): ...
# Node comparison
def isSupported_version_(self, feature: str, version: str) -> bool: ...
def hasAttributes(self) -> bool: ...
def isSameNode_(self, other: DOMNode) -> bool: ...
def isEqualNode_(self, other: DOMNode) -> bool: ...
def compareDocumentPosition_(self, other: DOMNode) -> int: ...
def contains_(self, other: DOMNode) -> bool: ...Base event class for all DOM events.
class DOMEvent:
# Event phases
CAPTURING_PHASE = 1
AT_TARGET = 2
BUBBLING_PHASE = 3
@property
def type(self) -> str: ...
@property
def target(self) -> DOMEventTarget: ...
@property
def currentTarget(self) -> DOMEventTarget: ...
@property
def eventPhase(self) -> int: ...
def bubbles(self) -> bool: ...
def cancelable(self) -> bool: ...
@property
def timeStamp(self) -> int: ...
def stopPropagation(self): ...
def preventDefault(self): ...
def initEvent_canBubbleArg_cancelableArg_(self, eventTypeArg: str, canBubbleArg: bool, cancelableArg: bool): ...
# Legacy properties
def cancelBubble(self) -> bool: ...
def setCancelBubble_(self, cancelBubble: bool): ...
def returnValue(self) -> bool: ...
def setReturnValue_(self, returnValue: bool): ...
@property
def srcElement(self) -> DOMEventTarget: ...User interface event extending DOMEvent.
class DOMUIEvent(DOMEvent):
@property
def view(self) -> DOMAbstractView: ...
@property
def detail(self) -> int: ...
@property
def which(self) -> int: ...
def initUIEvent_canBubble_cancelable_view_detail_(self, type: str, canBubble: bool, cancelable: bool, view: DOMAbstractView, detail: int): ...Mouse event extending DOMUIEvent.
class DOMMouseEvent(DOMUIEvent):
@property
def screenX(self) -> int: ...
@property
def screenY(self) -> int: ...
@property
def clientX(self) -> int: ...
@property
def clientY(self) -> int: ...
@property
def ctrlKey(self) -> bool: ...
@property
def shiftKey(self) -> bool: ...
@property
def altKey(self) -> bool: ...
@property
def metaKey(self) -> bool: ...
@property
def button(self) -> int: ...
@property
def relatedTarget(self) -> DOMEventTarget: ...
@property
def offsetX(self) -> int: ...
@property
def offsetY(self) -> int: ...
@property
def x(self) -> int: ...
@property
def y(self) -> int: ...
@property
def fromElement(self) -> DOMNode: ...
@property
def toElement(self) -> DOMNode: ...
def initMouseEvent_canBubble_cancelable_view_detail_screenX_screenY_clientX_clientY_ctrlKey_altKey_shiftKey_metaKey_button_relatedTarget_(self, type: str, canBubble: bool, cancelable: bool, view: DOMAbstractView, detail: int, screenX: int, screenY: int, clientX: int, clientY: int, ctrlKey: bool, altKey: bool, shiftKey: bool, metaKey: bool, button: int, relatedTarget: DOMEventTarget): ...Keyboard event extending DOMUIEvent.
class DOMKeyboardEvent(DOMUIEvent):
# Key locations
KEY_LOCATION_STANDARD = 0
KEY_LOCATION_LEFT = 1
KEY_LOCATION_RIGHT = 2
KEY_LOCATION_NUMPAD = 3
@property
def key(self) -> str: ...
@property
def code(self) -> str: ...
@property
def location(self) -> int: ...
@property
def ctrlKey(self) -> bool: ...
@property
def shiftKey(self) -> bool: ...
@property
def altKey(self) -> bool: ...
@property
def metaKey(self) -> bool: ...
@property
def repeat(self) -> bool: ...
@property
def isComposing(self) -> bool: ...
@property
def charCode(self) -> int: ...
@property
def keyCode(self) -> int: ...
@property
def which(self) -> int: ...
def getModifierState_(self, key: str) -> bool: ...CSS style declaration for element styling.
class DOMCSSStyleDeclaration:
@property
def cssText(self) -> str: ...
@property
def length(self) -> int: ...
@property
def parentRule(self) -> DOMCSSRule: ...
def getPropertyValue_(self, propertyName: str) -> str: ...
def getPropertyCSSValue_(self, propertyName: str) -> DOMCSSValue: ...
def removeProperty_(self, propertyName: str) -> str: ...
def getPropertyPriority_(self, propertyName: str) -> str: ...
def setProperty_value_priority_(self, propertyName: str, value: str, priority: str): ...
def item_(self, index: int) -> str: ...
def isPropertyImplicit_(self, propertyName: str) -> bool: ...List of DOM nodes.
class DOMNodeList:
@property
def length(self) -> int: ...
def item_(self, index: int) -> DOMNode: ...Collection of HTML elements.
class DOMHTMLCollection:
@property
def length(self) -> int: ...
def item_(self, index: int) -> DOMNode: ...
def namedItem_(self, name: str) -> DOMNode: ...import WebKit
# Assume you have a WebView instance
web_view = get_web_view() # Your WebView instance
document = web_view.mainFrame().DOMDocument()
# Find element by ID
element = document.getElementById_("myButton")
if element:
# Modify attributes
element.setAttribute_value_("class", "highlighted")
# Change content
element.setInnerHTML_("<strong>Click me!</strong>")
# Add event listener (in practice, you'd use JavaScript for this)
# This is just to show the API structure
print(f"Element tag: {element.tagName()}")
print(f"Element ID: {element.id()}")
# Find elements by tag name
inputs = document.getElementsByTagName_("input")
for i in range(inputs.length()):
input_element = inputs.item_(i)
if hasattr(input_element, 'type') and input_element.type() == "text":
input_element.setValue_("Default text")import WebKit
document = web_view.mainFrame().DOMDocument()
# Find form
form = document.getElementById_("myForm")
# Get all input elements in the form
inputs = form.getElementsByTagName_("input")
# Process each input
for i in range(inputs.length()):
input_elem = inputs.item_(i)
if input_elem.type() == "text":
print(f"Text input value: {input_elem.value()}")
input_elem.setValue_("New value")
elif input_elem.type() == "checkbox":
print(f"Checkbox checked: {input_elem.checked()}")
input_elem.setChecked_(True)
# Work with select elements
selects = form.getElementsByTagName_("select")
if selects.length() > 0:
select_elem = selects.item_(0)
print(f"Selected index: {select_elem.selectedIndex()}")
select_elem.setSelectedIndex_(2) # Select third optionimport WebKit
document = web_view.mainFrame().DOMDocument()
# Create new elements
div = document.createElement_("div")
div.setAttribute_value_("id", "newDiv")
div.setAttribute_value_("class", "container")
# Create text content
text = document.createTextNode_("Hello, World!")
div.appendChild_(text)
# Add to document
body = document.body()
body.appendChild_(div)
# Execute document commands
document.execCommand_("selectAll")
print(f"Can cut: {document.queryCommandEnabled_('cut')}")Install with Tessl CLI
npx tessl i tessl/pypi-pyobjc-framework-webkit