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()方法:
- from time import sleep
- msg_24g = self.browser.find_element_by_xpath("/html/body/div[7]/div/div[2]")
- while msg_24g.is_displayed():
- 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()好像也可以实现这个功能。