与网站表单交互

0 投票
1 回答
1593 浏览
提问于 2025-04-19 06:55

我正在尝试连接到一个学校的网址,并用selenium来自动化这个过程。最开始我试着用splinter,但遇到了类似的问题。我发现我无法与用户名和密码的输入框进行互动。后来我意识到我需要与一个iframe进行互动。目前我有:

import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()

driver.get("https://my.oregonstate.edu/webapps/login/")
driver.switch_to.frame('Content') #I tried contentFrame and content as well

loginid = driver.find_elements_by_id('user_id')
loginid.send_keys("***")
passwd = driver.find_elements_by_id('password')
passwd.send_keys("***")
sub = driver.find_elements_by_id('login')
sub.click()
time.sleep(5)
driver.close()

这是我想要互动的HTML:

网站链接:https://my.oregonstate.edu/webapps/portal/frameset.jsp

这个iframe:

<iframe id="contentFrame" style="height: 593px;" name="content" title="Content" src="/webapps/portal/execute/tabs/tabAction?tab_tab_group_id=_1_1" frameborder="0"></iframe>

表单:

用户名:

<input name="user_id" id="user_id" size="25" maxlength="50" type="text">

密码:

<input size="25" name="password" id="password" autocomplete="off" type="password">

看起来selenium能够找到这些元素,但我无法在这些输入框中输入任何信息,出现了“List对象没有这个属性”的错误。当我意识到这是一个iframe时,我尝试进入那个iframe,但它提示“无法找到框架:内容”。我是不是漏掉了其他的iframe?或者有什么明显的问题吗?这是我第一次在这里操作,如果我在代码链接上搞错了,请多多包涵。

谢谢你的帮助。

1 个回答

1

driver.switch_to.frame() 这个命令需要你提供框架的 idname,在你的情况下,框架的 idcontentFrame,而 namecontent。(它们不工作的原因可能是其他问题,请仔细阅读。)

首先,请尝试使用这两个中的任意一个,而不是 Content(注意这个有大写的 C)。

一旦你解决了上面的问题,你的代码中会出现另一个错误。

loginid = driver.find_elements_by_id('user_id')
loginid.send_keys("***")

driver.find_elements_by_id 会找到所有匹配的元素,返回的是一个列表。所以你不能直接使用 send_keys。请改用 driver.find_element_by_id('user_id')

这是我测试过的有效代码。

from selenium import webdriver

driver = webdriver.Firefox()

driver.get("https://my.oregonstate.edu/webapps/login/")
driver.switch_to.frame('content') # all lower case to match your actual frame name

loginid = driver.find_element_by_id('user_id')
loginid.send_keys("***")
passwd = driver.find_element_by_id('password')
passwd.send_keys("***")

关于你后面评论中的问题

from selenium import webdriver

driver = webdriver.Firefox()
driver.get("https://my.oregonstate.edu/webapps/login/?action=relogin")

loginid = driver.find_element_by_id('user_id')
loginid.send_keys("***")
passwd = driver.find_element_by_id('password')
passwd.send_keys("***")

driver.find_element_by_css_selector('.submit.button-1').click()

撰写回答