selenium无法登陆微博,提示无法针对id为loginname的元素进行send_keys操作

按第三课登陆微博的操作写了简单脚本代码如下:
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
url = "http://www.weibo.com/login.php"
dcap = dict(DesiredCapabilities.PHANTOMJS)
dcap["phamtonjs.page.settings.userAgent"]= user_agent
args = ["--load-images=false"]
browser = webdriver.PhantomJS(desired_capabilities=dcap,service_args=args)
browser.get(url)
current_url=browser.current_url
print(current_url)
print(browser.title) #成功打印出微博登录页面标题,说明获取网页成功
soup_basis = browser.page_source

loginform = browser.find_element_by_class_name("W_login_form") 
username = loginform.find_element_by_id("loginname") #找到用户名输入框
soup_username = soup.find_all("input",class_="W_input")[1]
print(soup_username) #用BeautifulSoup找同个元素打出来看看

username.send_keys("我的账号") #向selenium找到的username元素输入账号,到这一步就报错了

keybox = loginform.find_element_by_name("password") #找到输入密码的地方
soup_keybox = soup.find("input",class_="enter_psw") 
print(soup_keybox)

keybox.send_keys("我的密码")
submit = browser.find_element_by_link_text("登录")
submit.click()

current_url = browser.current_url
browser.get(current_url)
titel = browser.find_element_by_xpath("//head/titel").text
print(titel)
输出如下: "C:\Program Files\Python36-32\python.exe" "C:/Program Files/Python36-32/test1/selenium_login.py" http://www.weibo.com/login.php 微博-随时随地发现新鲜事 <input action-data="text=邮箱/会员帐号/手机号" action-type="text_copy" autocomplete="off" class="W_input" id="loginname" maxlength="128" name="username" node-type="username" tabindex="1" type="text"/>   错误信息:   Traceback (most recent call last):   File "C:/Program Files/Python36-32/test1/selenium_login.py", line 35, in <module>     username.send_keys("这里是我的用户名") #显示在send_keys这一步出错   File "C:\Program Files\Python36-32\lib\site-packages\selenium\webdriver\remote\webelement.py", line 347, in send_keys     self._execute(Command.SEND_KEYS_TO_ELEMENT, {'value': keys_to_typing(value)})   ------中间还有一还有一堆就不贴了:-----------   file "C:\Program Files\Python36-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 193, in check_response     raise exception_class(message, screen, stacktrace) selenium.common.exceptions.InvalidElementStateException: Message: {"errorMessage":"Element is not currently interactable and may not be manipulated"    #应该是说无法针对这个元素执行相应操作

Jikede

赞同来自:

我以前爬过新浪微博,它的反爬虫设置还是比较多的,而且还会逐步升级。 我之前的经验是:先获取已经登录的cookie,然后用selenium里面关于http请求的地方读取cookie来直接访问新浪微博

杨真

赞同来自:

你好,find_element_by_class_name() 返回的是数组 你需要用 find_element_by_class_name()[0] 这样的方式来取回元素,在课程上有讲过,class 对应的是一个类别的元素,可以有多个

Wendybear777

赞同来自:

@叉叉 老师您可能看错了,用find_elements返回的是数组,我用的find_element,返回的是数组的第一个元素,也就是说以下这句 loginform = browser.find_element_by_class_name("W_login_form")   返回的是一个webelement,而不是数组,为了验证我加了一行 print(len(loginform))​,打出的报错信息是: TypeError: object of type 'WebElement' has no len()   为了再次验证,我使用如下语句: loginform = browser.find_element_by_class_name("W_login_form")[0]   报错:TypeError: 'WebElement' object does not support indexing   说明返回的是element而并非数组   然后我把index去掉,恢复到原先的语句 username = loginform.find_element_by_id("loginname")   并加上一行打印类型的语句:
print(type(username))
打印出 <class 'selenium.webdriver.remote.webelement.WebElement'>   说明这个webelement已经被找到了   就是下一步send_keys怎么也send不了,报错信息如我主楼:   Message: {"errorMessage":"Element is not currently interactable and may not be manipulated"

Wendybear777

赞同来自:

而当我把loginform = browser.find_element_by_class_name("W_login_form")(element单数)改成loginform = browser.find_elements_by_class_name("W_login_form")(elements复数)时,找到的就是一个数组了,并且用print(len(loginform))得出,这个数组list长度为2(包括0位和1位)   用loginform = browser.find_element_by_class_name("W_login_form")(element单数)的话,返回的是第一个符合条件的元素,也就是find_elements(elements复数) 返回数组list的0位上的元素   那么,是不是应该用1位上的元素呢?所以我使用了 loginform =browser.find_elements_by_class_name("W_login_form")[1] username = loginform.find_element_by_id("loginname")   先找到这个list,再找到它的1号位元素,再以此为基础找loginform这个元素内部的登录框   然而返回的是错误信息   Traceback (most recent call last):   File "C:/Program Files/Python36-32/test1/selenium_login.py", line 26, in <module>     username = loginform.find_element_by_id("loginname")   selenium.common.exceptions.NoSuchElementException: Message: {"errorMessage":"Unable to find element with id 'loginname'"   也就是说,在1号位的loginform内部,根本找不到id值为loginname的元素,这时报错信息是:"Unable to find element with id 'loginname'"。   与之相反的是我主楼的原代码:  
loginform = browser.find_element_by_class_name(=1em"W_login_form"=1em) 
username = loginform.find_element_by_id(=1em"loginname"=1em)
=1em这里并没有报错,也就是说loginname这个元素是顺利找到了的,在定位元素这一步,代码并没有什么问题
=1em一直到=1emusername.send_keys("我的用户名")
=1em这里才报错,说跟元素没法互动
 

Wendybear777

赞同来自:

上面格式不知道怎么回事,一句话两头出现=1em。。。   再补充 干脆不先通过class定位,直接用id = loginname搜,结果仍然一样  
username = browser.find_element_by_id("loginname")
元素找到了
username.send_keys("我的用户名")
报错 
"Element is not currently interactable and may not be manipulated"  

大大

赞同来自:

我也一直报错NoSuchElementException,请问怎么解决啊?raise exception_class(message, screen, stacktrace) NoSuchElementException: {"errorMessage":"Unable to find element with xpath '//a[@rel = \"nofollow\"]'","request":{"headers":{"Accept":"application/json","Accept-Encoding":"identity","Connection":"close","Content-Length":"108","Content-Type":"application

杨真

赞同来自:

有可能你返回的页面不一样,你试试看把网页保存下来,同时看看 save_screenshot 是什么情况   另外,url 用 weibo.com ,不要带后面的login

要回复问题请先登录注册