如何使用Selenium Python识别chrome://settings/passwords页面中的Add按钮

jckbn6z7  于 2023-08-01  发布在  Go
关注(0)|答案(2)|浏览(122)

我正在写一个测试,需要在浏览器中存储一个愚蠢的网站的密码,我正在使用Selenium Python执行这个任务。我可以加载chrome://settings/passwords没有问题。
该任务需要单击“添加”按钮,并使用哑数据(如果不存在)填充表单。我面临的问题是选择按钮或设置页面的任何其他元素。
这是按钮的HTML元素:

<cr-button id="addPasswordButton" title="Add new password" role="button" tabindex="0" aria-disabled="false">
Add

字符串
我的想法是用以下选项之一选择它:

btn = web_driver.find_element(By.ID, "addPasswordButton")
btn = web_driver.find_element(By.XPATH, "//*[@id='addPasswordButton')]")


但两者都返回:

RtlGetAppContainerNamedObjectPath [0x773C7B3E+238]


页面中的任何其他元素都有相同的错误,除了顶层的settings-ui。我还尝试根据标记名选择元素,这看起来很自定义,但什么也没有。
此外,搜索错误并没有给出任何结果稀缺的线索。在我看来,设置页面是用嵌套的子页面构建的,Selenium无法检查它们。
我也试过切换到内页,但没有结果:

a = web_driver.find_element(By.XPATH, "//settings-ui")
web_driver.switch_to(a)


导致:

{TypeError}TypeError("'SwitchTo' object is not callable")


有没有一种方法可以解决这个问题,并能够选择一个元素,也提供了一个唯一的ID?

t40tm48m

t40tm48m1#

添加按钮位于多个#shadow-root


的数据

解决方案

要单击您nned的元素以使用document.querySelector(),您可以使用以下解决方案:

driver.get("chrome://password-manager/passwords")
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((driver.execute_script("return document.querySelector('settings-ui').shadowRoot.querySelector('settings-main').shadowRoot.querySelector('settings-basic-page').shadowRoot.querySelector('settings-autofill-page').shadowRoot.querySelector('passwords-section').shadowRoot.querySelector('cr-button#addPasswordButton')")))).click()

字符串
浏览器快照:


7rfyedvj

7rfyedvj2#

也许这个答案是有帮助的,你应该去shadowroot,应该试试:Is there any way to get element info inside the shadow root with Selenium?
使用上述方法,可以进入设置界面
这个设置页面有这么多的shadowRoot,耐心等待。

container = driver.find_element(By.TAG_NAME, "settings-ui")
shadowRoot = driver.execute_script("return arguments[0].shadowRoot", container)
container = shadowRoot.find_element(By.ID, "container").find_element(By.TAG_NAME, "settings-main")
shadowRoot = driver.execute_script("return arguments[0].shadowRoot", container)

字符串

相关问题