与网站表单交互
我正在尝试连接到一个学校的网址,并用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()
这个命令需要你提供框架的 id
或 name
,在你的情况下,框架的 id
是 contentFrame
,而 name
是 content
。(它们不工作的原因可能是其他问题,请仔细阅读。)
首先,请尝试使用这两个中的任意一个,而不是 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()