KJS
KJS

Reputation: 42

Interacting with website forms

I'm trying to connect to a school url and automate the process with selenium. Originally I tried using splinter, but ran into similar problems. I can't seem to be able to interact with the username and password fields. I realized a little ways in that it is an iframe that I need to interact with. Currently I have:

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()

Here is the HTML that I am trying to interact with:

The Website: https://my.oregonstate.edu/webapps/portal/frameset.jsp

The 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>

The forms:

Username:

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

Password:

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

It seems that selenium can locate the elements just find, but I am unable to input any information into these fields, I got the error 'List object has no attribute'. When I realized it was the iframe I tried to navigate into that but it says 'Unable to locate frame: Content'. Is there another iframe that I am missing? Or something obvious? This is my first time here so sorry if I messed something up with the code linking.

Thanks for the help.

Upvotes: 0

Views: 1687

Answers (1)

Yi Zeng
Yi Zeng

Reputation: 32845

driver.switch_to.frame() takes frame's id or name, where your frame have id = contentFrame and name = content. (The reason they didn't work is probably because of a different issue, read through please)

First, please try use either one of them, not Content (which has upper case C).

Once you have fixed the issue above, there will be another error in your code.

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

driver.find_elements_by_id finds all matching elements, which is a list. So you can't use send_keys. Please use driver.find_element_by_id('user_id').

Here is the code I tested working.

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("***")

Regarding issue in your following comments

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()

Upvotes: 1

Related Questions