UI自动测试中遇到

Python3 test:

错误提示:不能定位

Message: unknown error: cannot focus element

 

<input id="usernamehide" placeholder="用户名" value="" name="usernamehide" autocomplete="off" style="border-color: rgb(239, 239, 239); background-image: url("/mc/resources/image/people.png"); color: rgb(153, 153, 153);" type="text">
<input id="userpwd" onpaste="return false" value="密码" name="userpwd1" placeholder="密码" autocomplete="off" type="text">

 

在火狐或IE上可以正常运行,但是在Chrome则报错:

表单源代码如:

解决:

 

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
driver.get("https://emall.esgcc.com.cn/mc/mc/public/login")
driver.find_element_by_xpath(".//*[@id='usernamehide']").send_keys("GWSC00016034")
#定位密码输入框,解决:unknown error: cannot focus element
e1 = driver.find_element_by_xpath(".//*[@id='userpwd']")
action = ActionChains(driver)
action.move_to_element(e1).click().send_keys("xhsintcdw760").perform()

错误提示:元素失效

selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document

 

错误提示如上:这种问题通常是页面刷新后,再获取页面导致的。

 

解决方法:

对页面进行一次刷新,重新获取元素就能消除错误。

import unittest
from models.function import insert_img
from models.driver import driver_app
from page_obj.login_page import Login
from page_obj.edit_CV_page import Edit_CV
from time import sleep

class Edit_cv_test(unittest.TestCase):
    '''编辑用户简历模块'''
    def setUp(self):
        self.driver = driver_app()
        self.login = Login(self.driver)
        self.edit_cv = Edit_CV(self.driver)
        #用户登录
        self.login.user_login()
    def tearDown(self):
        self.driver.quit()
    def test_edit_sex(self):
        '''编辑用户性别测试'''
        self.edit_cv.edit_sex()
        #进入编辑简历页面
        self.driver.refresh()   #使用刷新函数refresh()刷新页面
        self.edit_cv.wait_element(*self.edit_cv.edit_cv_enter_loc).click()
        insert_img(self.driver,"编辑用户性别.jpg")
        #断言
        self.assertEqual(self.edit_cv.get_user_sex(),"男")
    def test_edit_birthday(self):
        '''编辑用户出生年月测试'''
        self.edit_cv.edit_user_birthday()
        self.driver.refresh()  #使用refresh()刷新页面
        self.edit_cv.wait_element(*self.edit_cv.edit_cv_enter_loc).click()
        insert_img(self.driver,"编辑用户出生年月.jpg")
        #断言
        self.assertEqual(self.edit_cv.get_user_birthday(),"1992-07-01")
if __name__ == "__main__":
    unittest.main()

错误提示:

selenium.common.exceptions.ElementNotVisibleException: Message: element not visible

意思是element是不可见的。所以无法获取到。这时候就遇到一个难题,怎么把element变成可见的呢?
这时候,我们就用ActionChains来模拟效果

使用前要先导入ActionChains类:

from selenium.webdriver.common.action_chains import ActionChains

ActionChains(driver).click(driver.find_element(By.ID,'idxxxx')).perform() #使用perform()才能执行action
这个时候,你会惊奇地发现:下拉菜单成功出现了。

这个是鼠标事件的单击鼠标左键。
http://www.mamicode.com/info-detail-1981462.html

 

错误提示:

解决Selenium报错:Element is not clickable at point (x, y). Other element would receive the click。

也就是:

元素在坐标(1191.5,143)处不可进行点击操作,其他元素或许会收到这个点击操作。

出现弹窗后,实际上这个按钮是clickable的,所以这样等待没用。

简单的等待方法就是直接采用time.sleep()方法进行延时,但这种方法比较土,等待时间并不精确。

div标签的display属性在弹窗期间等于block,表示弹窗可见,而弹窗前和结束后会变为none,弹窗被隐藏。

那么代码就很好写了,只要等待这个div的display属性变为none就代表配置结束了,正好可以利用Selenium中的is_displayed()方法:

 

  1. from time import sleep  
  2.   
  3. msg_24g = self.browser.find_element_by_xpath("/html/body/div[7]/div/div[2]")  
  4. while msg_24g.is_displayed():  
  5.       sleep(1)  

定位这整个弹框,然后使用.is_displayed(),就可以了。

def createLectureTopic(self,topicname):

self.wait_element(*self.createTopicButton_loc).click()

nowHandle = self.driver.current_window_handle

self.wait_element(*self.lectureTopic_loc).click()

allHandles = self.driver.window_handles

for i in allHandles:

if i != nowHandle:

self.driver.switch_to.window(i)

# 课程主题

text = str(topicname)+str(time.time())

# js = "var sum=document.get_element_by_id('topic-title-edit');sum.value='" + text + "';"

# self.execute_js(src=js)

self.wait_element(*self.topicName_loc).send_keys(text)

# 开始时间,鼠标左键单击操作

time.sleep(1)

ActionChains(self.driver).click(self.wait_element(*self.startTime_loc)).perform()

# 处理弹窗,当弹窗可见后,执行选择时间操作

while self.wait_element(*self.timeControlWindow_loc).is_displayed():

time.sleep(1)

self.wait_element(*self.ensureStartTime_loc).click()

time.sleep(1)

break

# 下一步

return self.wait_element(*self.nextStep_loc).click()

另外expected_conditions里面有个方法is_visibility()好像也可以实现这个功能。

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值