关键词:selenium、python、Chrome
测试需求:邮箱登录后,发送测试邮件
一、登录
Chrome F12定位后,发现账号输入框是有id属性,这是我们最希望看到的。
账号输入元素.png 密码输入框同样也有id属性。 密码输入元素.png
登录按钮元素定位如下: 登录元素1.png
登录按钮,如果通过CSS选择器定位 .w-button,发现有2个。 登录元素2.png
如果切换到第二个定位到的元素发现,2个元素的属性很像。差别就在:一个元素class是w-button-account,一个元素class是w-button-admin。
<button class="w-button w-button-account js-loginbtn" type="submit" tabindex="4">登 录</button>
<button class="w-button w-button-admin js-loginbtn" type="submit" tabindex="4">管理员登录</button>
所以最终我们决定使用.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()
二、点击写信按钮
登录成功后,需要点击写信。
元素定位发现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()
三、编辑内容-收件人
点击写信按钮之后,跳转到编辑界面。
元素定位后,发现收件人有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这些元素才可以输入。
有两种解决方案:
方案一:找到div下面的input标签,send_keys
代码如下:
#编辑内容
#收件人
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里面,不需要切换:
代码如下:
driver.find_element_by_id("subject").send_keys("test")
五、编辑内容-内容
内容定位到body元素,前面有一个HtmlEditor frame。再往前切换还有一个editor frame。再往前切换还有foldmain frame。
HtmlEditor.png editor.png
foldmain.png
目前为止,我们使用过的frame的架构图如下:
frame框架.png
六、发送
发送直接通过id属性定位,但是发送按钮在foldmain 这个frame下面:
代码如下:
#发送
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()
网友评论