selenium实战1

作者: 行水坐云 | 来源:发表于2018-03-26 12:41 被阅读0次

    关键词: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。
    <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()
    

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

    写信.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

        本文链接:https://www.haomeiwen.com/subject/uenlcftx.html