首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Selenium中窗口或框架之间的移动或切换是如何工作的?

在Selenium中窗口或框架之间的移动或切换是如何工作的?
EN

Stack Overflow用户
提问于 2022-01-23 10:45:20
回答 1查看 216关注 0票数 0

我正在写一个网络抓取脚本,自动登录到我的电子邮件帐户,并发送一条消息。

我已经将代码写到了浏览器单击"new Message“按钮的程度。之后是一个新窗口(还是新框架?)打开可以键入收件人地址、主题和邮件的地方。

代码语言:javascript
复制
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

myPassword = 'xxxxxxxxxxxxxxxx'

browser = webdriver.Firefox() # Opens Firefox webbrowser
browser.get('https://protonmail.com/') # Go to protonmail website
loginButton = WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "a.btn-ghost:nth-child(1)")))
loginButton.click()
usernameElem = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#username")))
usernameElem.send_keys("first.last@protonmail.com")
passwordElem = browser.find_element_by_css_selector("#password")
passwordElem.send_keys(myPassword)
anmeldenButton = browser.find_element_by_css_selector(".button")
anmeldenButton.click()
newMessage = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.XPATH, "/html/body/div[1]/div[3]/div/div/div[1]/div[2]/button")))
newMessage.click()
addressElem = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#to-composer-1591")))
addressElem.send_keys('first.last@mail.com')

在下面的第一行中,我得到一个TimeoutException错误:

代码语言:javascript
复制
addressElem = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#to-composer-1591")))
addressElem.send_keys('asdf')

我认为会发生错误,因为浏览器不知道在哪里找到元素,对吗?

我查看了文档:https://selenium-python.readthedocs.io/navigating.html?highlight=frame#moving-between-windows-and-frames

“新消息”按钮的源代码如下所示:

代码语言:javascript
复制
<button class="button button-large button-solid-norm text-bold mt0-25 w100 no-mobile" aria-busy="false" type="button" data-testid="sidebar:compose" aria-describedby="tooltip-8">Neue Nachricht</button>

新窗口或框架的源代码:

代码语言:javascript
复制
<span class="flex-item-fluid p0-5 pr1 pl0-75 text-ellipsis user-select-none cursor-move">Neue Nachricht</span>

我不确定我是否走上了解决这个问题的正确道路。我试图在源代码中找到信息,这有助于浏览器找到正确的元素,并使用.switch_to_window()或.switch_to_frame()方法。首先,我不确定,切换到一个新的窗口或框架是否真的是一个问题(我真的不知道它们之间的区别)。第二:如何实现切换到新元素,以便浏览器可以应用.send_keys()方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-23 11:35:48

我看了看HTMLDOM,没有看到任何iframe或窗户被打开。

无法与输入字段交互的原因是因为您正在使用这个CSS选择器#to-composer-1591最后一部分1591是动态的,这意味着它将在每个新的浏览器实例上发生变化。

修复:您应该使用整个HTMLDOM中唯一的input[id^='to-composer']

代码语言:javascript
复制
addressElem = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[id^='to-composer']")))
addressElem.send_keys('first.last@mail.com')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70821234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档