Selenium如何获取iframe内指定坐标位置的元素链接?
问题:获取iframe内指定坐标位置的元素链接
原脚本实现了传入URL和坐标,返回对应位置元素的角色和链接:
def get_link(url,x,y): DEFAULT_CHROME_WINDOWS_SIZE = '1024,2160' Options = ChromeOptions() Options.add_argument("--headless") Options.add_argument('--window-size={}'.format(DEFAULT_CHROME_WINDOWS_SIZE)) driver = webdriver.Chrome(options=Options,executable_path="/usr/lib/chromium-browser/chromedriver") driver.get(url) time.sleep(3) elem_by_coords=driver.execute_script("return document.elementFromPoint(arguments[0], arguments[1])", x, y) link=elem_by_coords.get_attribute("href") return elem_by_coords.aria_role,link
场景复现
- 当目标元素在主文档中时(如
https://workflowy.com/s/aunt-sparkies-inc/JVbOUV2xLta97A77),脚本可正常返回链接:elem_type=link link=https://u.to/QM6CHA - 当目标元素位于iframe内时(如
https://indd.adobe.com/view/72dacb55-647a-49ba-838b-8e82de10290a),脚本仅识别到iframe元素,无法获取内部带href的目标元素:elem_type=Iframe link=None
解决方案
问题核心是:document.elementFromPoint在主文档上下文执行时,只会返回iframe元素本身,无法穿透到iframe内部的DOM。需要先切换到iframe的上下文,再执行坐标定位逻辑。
修改后的脚本如下:
def get_link(url,x,y): DEFAULT_CHROME_WINDOWS_SIZE = '1024,2160' Options = ChromeOptions() Options.add_argument("--headless") Options.add_argument('--window-size={}'.format(DEFAULT_CHROME_WINDOWS_SIZE)) driver = webdriver.Chrome(options=Options,executable_path="/usr/lib/chromium-browser/chromedriver") driver.get(url) time.sleep(3) # 先在主文档获取坐标对应的元素 elem_by_coords = driver.execute_script("return document.elementFromPoint(arguments[0], arguments[1])", x, y) # 判断是否为iframe,若是则切换到该iframe上下文 if elem_by_coords.tag_name.lower() == "iframe": driver.switch_to.frame(elem_by_coords) # 在iframe内部重新获取坐标对应的元素 elem_by_coords = driver.execute_script("return document.elementFromPoint(arguments[0], arguments[1])", x, y) link = elem_by_coords.get_attribute("href") # 切换回主文档(避免后续操作受影响) driver.switch_to.default_content() driver.quit() # 优先取aria_role,无则返回标签名 elem_role = elem_by_coords.aria_role if hasattr(elem_by_coords, 'aria_role') else elem_by_coords.tag_name return elem_role, link
关键说明
- 判断并切换iframe:通过元素的
tag_name判断是否为iframe,若为iframe则调用driver.switch_to.frame()切换到该iframe的DOM上下文。 - 重新定位元素:切换后再次执行
document.elementFromPoint,此时是在iframe内部的文档中查找元素,能拿到目标带href的元素。 - 切回主文档:操作完成后调用
switch_to.default_content()回到主文档,避免后续操作出现上下文错误。
内容的提问来源于stack exchange,提问作者c00kie_monster
相关产品推荐
相关产品推荐

