selenium实战1

关键词:selenium、python、Chrome
测试需求:邮箱登录后,发送测试邮件
一、登录

登录界面.png

Chrome F12定位后,发现账号输入框是有id属性,这是我们最希望看到的。
账号输入元素.png

密码输入框同样也有id属性。
密码输入元素.png

登录按钮元素定位如下:
登录元素1.png

登录按钮,如果通过CSS选择器定位 .w-button,发现有2个。
登录元素2.png

如果切换到第二个定位到的元素发现,2个元素的属性很像。差别就在:一个元素class是w-button-account,一个元素class是w-button-admin。


所以最终我们决定使用.w-button-account去定位。

登录的代码如下:(敏感词使用xxxxx表示)

#login
driver.find_element_by_id("accname").send_keys('xxxxxxxxxx')
driver.find_element_by_id("accpwd").send_keys('xxxxxx')
driver.find_element_by_css_selector(".w-button-account").click()

二、点击写信按钮
登录成功后,需要点击写信。

写信.png

元素定位发现a标签有一个aXieXIN class属性,也是可以唯一定位的。
写信按钮.png

但是注意下,前面有个html标签,需要考虑frame的存在。关于frame的理解参考selenium frame讲解和案例
切换过去后,的确有一个frame。
frame-folder.png

代码如下:

time.sleep(2)   #登录有的时候页面加载会慢,加个延迟处理
driver.switch_to.frame("folder")
driver.find_element_by_css_selector(".aXieXIN").click()

三、编辑内容-收件人
点击写信按钮之后,跳转到编辑界面。

编辑.png

元素定位后,发现收件人有id属性oDivTo,也有frame的处理。
收件人元素.png

代码如下:

driver.switch_to.default_content()
driver.switch_to.frame("foldmain")
time.sleep(2)
driver.find_element_by_css_selector("#oDivTo").send_keys("xxxxxxxxxx"+'\n')

但是执行过程中,报错connot focus element。而且在收件人输入框,根本没有光标闪烁,怪不得获得不到焦点呢。没有焦点,无法输入。


报错.png

收件人.png

本以为元素需要click,再输入。但是加大延迟后,发现一开始光标是闪烁的,但是执行send_keys时就报错。


光标.png

经过多番排查,终于知道原因。我们回顾下我们之前定位的元素,收件人的元素我们定位的是div标签,但是div标签是不能够输入的,input和body这些元素才可以输入。

收件人元素.png

有两种解决方案:
方案一:找到div下面的input标签,send_keys

input.png

代码如下:

#编辑内容
#收件人
time.sleep(2)
driver.switch_to.default_content()
driver.switch_to.frame("foldmain")
driver.find_element_by_css_selector("#oDivTo input").send_keys("xxxxxxxxxxx"+'\n')

方案二:使用ActionChains动作链,这个类常用于一些键鼠操作。代码如下:

time.sleep(2)
driver.switch_to.default_content()
driver.switch_to.frame("foldmain")
from selenium.webdriver.common.action_chains import ActionChains
ac=ActionChains(driver)
receiver=driver.find_element_by_id("oDivTo")
ac.click(receiver).send_keys("xxxxxxxxxx"+'\n').perform()

四、编辑内容-主题
主题元素通过id属性定位,主题元素也是在foldmain这个frame里面,不需要切换:

主题.png

代码如下:

driver.find_element_by_id("subject").send_keys("test")

五、编辑内容-内容
内容定位到body元素,前面有一个HtmlEditor frame。再往前切换还有一个editor frame。再往前切换还有foldmain frame。

内容元素.png

HtmlEditor.png

editor.png

foldmain.png

目前为止,我们使用过的frame的架构图如下:


frame框架.png

六、发送
发送直接通过id属性定位,但是发送按钮在foldmain 这个frame下面:

image.png

代码如下:

#发送
driver.switch_to.default_content()
driver.switch_to.frame("foldmain")
driver.find_element_by_id("oSendButton1").click()

------------------------------------------------------------------------------------------最终代码如下:

from selenium import  webdriver
import  time
driver=webdriver.Chrome('d:\webdriver\chromedriver.exe')
driver.implicitly_wait(10)
driver.get("https://qiye.163.com/login/")
#login
driver.find_element_by_id("accname").send_keys('xxxxxxxx')
driver.find_element_by_id("accpwd").send_keys('xxxxxxxx')
driver.find_element_by_css_selector(".w-button-account").click()



#点击写信
time.sleep(2)   #登录有的时候页面加载会慢,加个延迟处理
driver.switch_to.frame("folder")
driver.find_element_by_css_selector(".aXieXIN").click()

#方法一
#编辑内容
#收件人
# time.sleep(2)
# driver.switch_to.default_content()
# driver.switch_to.frame("foldmain")
# driver.find_element_by_css_selector("#oDivTo input").send_keys("xxxxxxxxxxxx"+'\n')


#方法二
time.sleep(2)
driver.switch_to.default_content()
driver.switch_to.frame("foldmain")
from selenium.webdriver.common.action_chains import ActionChains
ac=ActionChains(driver)
receiver=driver.find_element_by_id("oDivTo")
ac.click(receiver).send_keys("xxxxxxxxxxx"+'\n').perform()



#主题
driver.find_element_by_id("subject").send_keys("test")

#内容
driver.switch_to.frame("editor")
driver.switch_to.frame("HtmlEditor")
driver.find_element_by_tag_name("body").send_keys("test")


#发送
driver.switch_to.default_content()
driver.switch_to.frame("foldmain")
driver.find_element_by_id("oSendButton1").click()

input()
driver.quit()

你可能感兴趣的:(selenium实战1)