51Testing软件测试论坛

标题: python+selenuim2,webdriver [打印本页]

作者: dy569464507    时间: 2016-6-21 15:32
标题: python+selenuim2,webdriver
哪位大神能帮帮忙,利用各种取元素的方式,都找不图片中圈出地方的元素,代码总是过不去,提示Traceback (most recent call last):
  File "C:/Users/dy/PycharmProjects/untitled/Login/addCard.py", line 15, in <module>
    login.driver.find_element_by_css_selector("#form1>div.hc_cont>ul>li:nth-child(10)>em").click()
  File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 397, in find_element_by_css_selector
    return self.find_element(by=By.CSS_SELECTOR, value=css_selector)
  File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 707, in find_element
    {'using': by, 'value': value})['value']
  File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 196, in execute
    self.error_handler.check_response(response)
  File "C:\Python27\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 181, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element
  (Session info: chrome=42.0.2311.90)
  (Driver info: chromedriver=2.9.248315,platform=Windows NT 6.1 x86_64)

取元素方法:
login.driver.find_element_by_xpath('//*[@id="form1"]/div[3]/ul/li[9]/em').click()
login.driver.find_element_by_css_selector("#form1>div.hc_cont>ul>li:nth-child(10)>em").click()
以上两种港式都使用过了,但是代码就是到这过不去,哪位高手能给指点一下么?E:\QQ图片20160621152405.png
作者: dy569464507    时间: 2016-6-21 15:37
E:\工具\QQ图片20160621152405.png
作者: dy569464507    时间: 2016-6-21 15:43
本帖最后由 dy569464507 于 2016-6-21 16:01 编辑

[attach]101563[/attach]这是图片,请大神指点一下,谢谢~
作者: 若尘_51    时间: 2016-6-21 15:44
定位不到主要有两种情况:出现框架(frame) 或窗口(window)
你尝试下这两种情况:
(1)框架(frame) :switch_to_frame(framename)
(2)打开新窗口:    driver.switch_to_window(driver.window_handles[-1])


还是附上图看看吧
作者: dy569464507    时间: 2016-6-21 15:58
若尘_51 发表于 2016-6-21 15:44
定位不到主要有两种情况:出现框架(frame) 或窗口(window)
你尝试下这两种情况:
(1)框架(frame) ...

图附上了,我在回复里弄上的,您看一下
作者: 掉渣饼    时间: 2016-6-21 16:20
如果没有框架和窗口节点,你可以试试login.driver.find_element_by_xpath('//*[@id="form1"]/div[3]/ul/li[9]/em').click()在它前面加个等待时间time.sleep(10),前提是要在加上import time。如果还是不行,那你可以尝试先去定位到你想要找的节点的父节点,一级级的往上定位.
作者: 若尘_51    时间: 2016-6-21 16:27
dy569464507 发表于 2016-6-21 15:58
图附上了,我在回复里弄上的,您看一下

可以尝试下:
(1)你的建设银行是在第十个li
login.driver.find_element_by_xpath('//*[@id="form1"]/div[3]/ul/li[9]/em').click()
(2)定位到li层
(3)看看能不能打印出来
text = login.driver.find_element_by_xpath('//*[@id="form1"]/div[3]/ul/li[10]/em').text
print text
(4)你用的谷歌浏览器,换火狐浏览器试试~~  有可能是浏览器的问题



作者: dy569464507    时间: 2016-6-21 17:34
若尘_51 发表于 2016-6-21 16:27
可以尝试下:
(1)你的建设银行是在第十个li
login.driver.find_element_by_xpath('//*[@id="form1"]/ ...

text = login.driver.find_element_by_xpath('//*[@id="form1"]/div[3]/ul/li[10]/em').text
print(text)
我这么试了,打印不出来,还有什么办法么?
作者: dy569464507    时间: 2016-6-21 18:11
掉渣饼 发表于 2016-6-21 16:20
如果没有框架和窗口节点,你可以试试login.driver.find_element_by_xpath('//*[@id="form1"]/div[3]/ul/li[ ...

加time我试过了,不行,就是找不到要的元素
作者: 若尘_51    时间: 2016-6-22 08:40
dy569464507 发表于 2016-6-21 17:34
text = login.driver.find_element_by_xpath('//*[@id="form1"]/div[3]/ul/li[10]/em').text
print(text ...

贴出对应的脚本看看吧。   (或浏览器试了吗?)
作者: 掉渣饼    时间: 2016-6-22 09:47
WebDriverWait(login, 10).until(lambda the_driver: the_driver.find_element_by_class_name("clearfix").is_displayed())
menu=login.find_element_by_class_name("clearfix").find_element_by_link_text("建设银行")
webdriver.ActionChains(login).double_click(menu).perform()

前提是要导入
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains

如果不行把webdriver.ActionChains(login).double_click(menu).perform()替换成ActionChains(login).double_click(menu).perform()

作者: dy569464507    时间: 2016-6-22 13:17
掉渣饼 发表于 2016-6-22 09:47
WebDriverWait(login, 10).until(lambda the_driver: the_driver.find_element_by_class_name("clearfix"). ...

#coding=utf-8
import login

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains

login.driver.find_element_by_xpath("/html/body/div[5]/div[2]/div[11]/div").click()
'''text = login.driver.find_element_by_xpath('//*[@id="form1"]/div[3]/ul/li[10]/em').text
print(text)
login.driver.find_element_by_xpath('//*[@id="form1"]/div[3]/ul/li[9]/em').click()'''

WebDriverWait(login, 10).until(lambda the_driver: login.driver.find_element_by_class_name("clearfix").is_displayed())
menu=login.driver.find_element_by_class_name("clearfix").find_element_by_link_text(u"建设银行")
ActionChains(login).double_click(menu).perform()

这是我写的代码,我把您给我的代码放进去了,但是这段代码还是提示menu=login.driver.find_element_by_class_name("clearfix").find_element_by_link_text(u"建设银行")找不元素。
问题:Traceback (most recent call last):
  File "C:/Users/dy/PycharmProjects/untitled/Login/addCard.py", line 13, in <module>
    menu=login.driver.find_element_by_class_name("clearfix").find_element_by_link_text(u"寤鸿閾惰")
  File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webelement.py", line 160, in find_element_by_link_text
    return self.find_element(by=By.LINK_TEXT, value=link_text)
  File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webelement.py", line 468, in find_element
    {"using": by, "value": value})['value']
  File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webelement.py", line 448, in _execute
    return self._parent.execute(command, params)
  File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 196, in execute
    self.error_handler.check_response(response)
  File "C:\Python27\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 181, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element

ps:login是我写的登录脚本
作者: dy569464507    时间: 2016-6-22 13:18
若尘_51 发表于 2016-6-22 08:40
贴出对应的脚本看看吧。   (或浏览器试了吗?)

# -*- coding: UTF-8 -*-
import login
# import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains

login.driver.find_element_by_xpath("/html/body/div[5]/div[2]/div[11]/div").click()
text = login.driver.find_element_by_xpath('//*[@id="form1"]/div[3]/ul/li[10]/em').text
print(text)
login.driver.find_element_by_xpath('//*[@id="form1"]/div[3]/ul/li[9]/em').click()
这是我的脚本
作者: 若尘_51    时间: 2016-6-22 13:43
dy569464507 发表于 2016-6-22 13:18
# -*- coding: UTF-8 -*-
import login
# import time

真的看不出什么错误的,你用Selenium IDE录制你的操作,导出python-unittest-webdriver脚本,看看脚本跟你的哪里不一样~~      
作者: 掉渣饼    时间: 2016-6-22 15:35
我建议你先把登录脚本直接放到里面,试试
#coding=utf-8
你登录脚本中引入的东西
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains

登录脚本

WebDriverWait(driver, 10).until(lambda the_driver: the_driver.find_element_by_class_name("clearfix").is_displayed())
menu=driver.find_element_by_class_name("clearfix").find_element_by_link_text("建设银行")
ActionChains(driver).double_click(menu).perform()

或者你把你登录脚本贴出来看下
作者: dy569464507    时间: 2016-6-22 16:07
若尘_51 发表于 2016-6-22 13:43
真的看不出什么错误的,你用Selenium IDE录制你的操作,导出python-unittest-webdriver脚本,看看脚本跟 ...

driver.find_element_by_css_selector("em.8").click()
selenuim IDE中导出的是这个,但是,我也试了,还是不行,说不是有效的

问题:selenium.common.exceptions.InvalidElementStateException: Message: invalid element state: Failed to execute 'querySelector' on 'Document': 'em.8' is not a valid selector.
作者: dy569464507    时间: 2016-6-22 16:09
掉渣饼 发表于 2016-6-22 15:35
我建议你先把登录脚本直接放到里面,试试
#coding=utf-8
你登录脚本中引入的东西

#coding=utf-8
from selenium import webdriver
import time
#登录sso,进入会员中心
driver = webdriver.Chrome()
driver.get("网址")
time.sleep(5)
driver.find_element_by_id("fir_li").click()
driver.find_element_by_id("tel_login").clear()
driver.find_element_by_id("tel_login").send_keys("用户名")
driver.find_element_by_id("pwd_login").clear()
driver.find_element_by_id("pwd_login").send_keys("密码")
driver.find_element_by_id("new_mobilelogin").click()
这是我登录的脚本
作者: 若尘_51    时间: 2016-6-22 17:20
dy569464507 发表于 2016-6-22 16:07
driver.find_element_by_css_selector("em.8").click()
selenuim IDE中导出的是这个,但是,我也试了, ...

异常:  selenium.common.exceptions.ElementNotSelectableException(msg=None, screen=None, stacktrace=None)
依据:     selenium.common.exceptions.InvalidElementStateException
         当尝试选择一个未能选中的元素时,异常会抛出


请问下你这个定位的是什么元素?  链接还是?
作者: 若尘_51    时间: 2016-6-22 17:20
dy569464507 发表于 2016-6-22 16:07
driver.find_element_by_css_selector("em.8").click()
selenuim IDE中导出的是这个,但是,我也试了, ...

异常:  selenium.common.exceptions.ElementNotSelectableException(msg=None, screen=None, stacktrace=None)
依据:     selenium.common.exceptions.InvalidElementStateException
         当尝试选择一个未能选中的元素时,异常会抛出


请问下你这个定位的是什么元素?  链接还是?
作者: 若尘_51    时间: 2016-6-22 17:34
dy569464507 发表于 2016-6-22 16:09
#coding=utf-8
from selenium import webdriver
import time

(1) 尝试换别的浏览器:火狐或IE。
(2) 尝试能不能定位到本页的其他元素,看看脚本是不是已经切换到当前页面。
作者: 掉渣饼    时间: 2016-6-22 17:37
脚本一:
#coding=utf-8
from selenium import webdriver
import time
#登录sso,进入会员中心
driver = webdriver.Chrome()
driver.get("网址")
time.sleep(5)
driver.find_element_by_id("fir_li").click()
driver.find_element_by_id("tel_login").clear()
driver.find_element_by_id("tel_login").send_keys("用户名")
driver.find_element_by_id("pwd_login").clear()
driver.find_element_by_id("pwd_login").send_keys("密码")
driver.find_element_by_id("new_mobilelogin").click()
time.sleep(5)
driver.find_element_by_xpath('//*[@id="form1"]/div[3]/ul/li[9]/em').click()

脚本二:
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains
import time
#登录sso,进入会员中心
driver = webdriver.Chrome()
driver.get("网址")
time.sleep(5)
driver.find_element_by_id("fir_li").click()
driver.find_element_by_id("tel_login").clear()
driver.find_element_by_id("tel_login").send_keys("用户名")
driver.find_element_by_id("pwd_login").clear()
driver.find_element_by_id("pwd_login").send_keys("密码")
driver.find_element_by_id("new_mobilelogin").click()
WebDriverWait(driver, 10).until(lambda the_driver: the_driver.find_element_by_class_name("clearfix").is_displayed())
menu=driver.find_element_by_class_name("clearfix").find_element_by_link_text("建设银行")
ActionChains(driver).double_click(menu).perform()

这两个脚本你都试试,看行不
作者: dy569464507    时间: 2016-6-22 18:13
若尘_51 发表于 2016-6-22 17:34
(1) 尝试换别的浏览器:火狐或IE。
(2) 尝试能不能定位到本页的其他元素,看看脚本是不是已经切换到 ...

[attach]101581[/attach]今天问了一下前端,说是用了iframe框架,实在抱歉,耽误你这么长时间,能给说一下iframe框架怎么实现元素定位么?
作者: dy569464507    时间: 2016-6-22 18:14
若尘_51 发表于 2016-6-22 17:34
(1) 尝试换别的浏览器:火狐或IE。
(2) 尝试能不能定位到本页的其他元素,看看脚本是不是已经切换到 ...

我的火狐不知道为什么,只能打开浏览器,不能进行操作,连输入网址都不行
作者: 掉渣饼    时间: 2016-6-22 19:46
有框架的话使用driver.switch_to_frame("框架id"),在你要定位的元素前面加上
如果你后面定位的元素又不在这个框架中,要跳出这个框架使用driver.switch_to_default_content()

作者: dy569464507    时间: 2016-6-23 16:18
掉渣饼 发表于 2016-6-22 19:46
有框架的话使用driver.switch_to_frame("框架id"),在你要定位的元素前面加上
如果你后面定位的元素又不在 ...

非常感谢,问题解决了,真是谢谢了




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2