1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
from webdriver.bidi.modules.script import ContextTarget
def remote_mapping_to_dict(js_object):
obj = {}
for key, value in js_object:
obj[key] = value["value"]
return obj
async def get_inview_center_bidi(bidi_session, context, element):
elem_rect = await get_element_rect(bidi_session, context=context, element=element)
viewport_rect = await get_viewport_rect(bidi_session, context=context)
x = {
"left": max(0, min(elem_rect["x"], elem_rect["x"] + elem_rect["width"])),
"right": min(
viewport_rect["width"],
max(elem_rect["x"], elem_rect["x"] + elem_rect["width"]),
),
}
y = {
"top": max(0, min(elem_rect["y"], elem_rect["y"] + elem_rect["height"])),
"bottom": min(
viewport_rect["height"],
max(elem_rect["y"], elem_rect["y"] + elem_rect["height"]),
),
}
return {
"x": (x["left"] + x["right"]) / 2,
"y": (y["top"] + y["bottom"]) / 2,
}
async def get_element_rect(bidi_session, context, element):
result = await bidi_session.script.call_function(
function_declaration="""
el => el.getBoundingClientRect().toJSON()
""",
arguments=[element],
target=ContextTarget(context["context"]),
await_promise=False,
)
return remote_mapping_to_dict(result["value"])
async def get_viewport_rect(bidi_session, context):
expression = """
({
height: window.innerHeight || document.documentElement.clientHeight,
width: window.innerWidth || document.documentElement.clientWidth,
});
"""
result = await bidi_session.script.evaluate(
expression=expression,
target=ContextTarget(context["context"]),
await_promise=False,
)
return remote_mapping_to_dict(result["value"])
|