使用selenium_python 的坑

上一篇 / 下一篇  2016-09-14 00:08:20 / 个人分类:selenium


#-*- coding: UTF-8 -*-
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from time import sleep
import time
import unittest,re

class PythonWebdrResource(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.implicitly_wait(30)
        self.base_url = ""

    def test_python_webdr_resource(self, number=4):
        driver = self.driver
        driver.get(self.base_url)
        # driver.find_element_by_css_selector("#main").send_keys(Keys.CONTROL, Keys.SUBTRACT)
        # driver.find_element_by_css_selector("#main").send_keys(Keys.CONTROL, '\ue027')
        driver.find_element_by_id("wkun").clear()
        driver.find_element_by_id("wkun").send_keys("E1555A13112")
        driver.find_element_by_id("wkpw").clear()
        driver.find_element_by_id("wkpw").send_keys("")
        driver.find_element_by_id("dl").click()
        # sleep(2)
        if number == None:
            pass
        else:
            print "number is not null"
            driver.execute_script("document.body.style.zoom='25%'")
            cssstr = "div.proOne:nth-child(%d) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)" % (number+1)
            print cssstr
           
            driver.find_element_by_css_selector(cssstr).click()
        driver.find_element_by_link_text(u"开始学习").click()
        if driver.find_element_by_class_name("ui_state_highlight").is_displayed():#是否继续
            driver.find_element_by_class_name("ui_state_highlight").click()
        else:
            driver.find_element_by_id("treeDemo_1_span").click()
            driver.find_element_by_link_text(u"观看").click()
        sleep(2)
        driver.find_element_by_link_text(u"返回").click()
        self.findCourse()
        # driver.find_element_by_css_selector("button.vjs-big-play-button").click()
        sleep(5)
        # driver.find_element_by_css_selector("#video_div_video > div.vjs-big-play-button").click()

        while True:
            #获取时间戳的百分比
            value = driver.find_element_by_css_selector("#video_div_video > div.vjs-control-bar > div.vjs-progress-control.vjs-control > div").get_attribute("aria-valuenow")
            print value
            value = float(value.encode())
            print type(value)
            sleep(2)
            if value > 99:
                print 'value = 100'
                sleep(2)
                try:
                    m = 0
                    while driver.find_element_by_link_text(u"返回").is_displayed():
                        driver.find_element_by_link_text(u"返回").click()
                        m = m + 1
                        sleep(5)
                        print "click fanhui button ",m
                except:
                    print 'press fanhui button success'
                    pass
                self.findCourse()
               
            else:
                print "sleep 1300"
                print time.ctime()
                sleep(1300)
                try:
                    if driver.find_element_by_class_name("ui_state_highlight").is_displayed():#确定按钮
                        driver.find_element_by_class_name("ui_state_highlight").click()
                except:
                    print 'highlight button not exists'
                    pass

    def findCourse(self):
        number = 4
        driver = self.driver
        #点击第一章
        driver.find_element_by_css_selector("#treeDemo > li:nth-child(1)").click()
        sleep(1)
        #获取章节的目录个数
        num = driver.find_elements_by_css_selector("#treeDemo>li")
        for index in range(len(num)):
            print "index:%s" % index
            if index > 7: #大于8,滑块向下划
                start = driver.find_element_by_css_selector(".r_scrollBar")
                end = driver.find_element_by_css_selector(".r_bottom")
                ActionChains(driver).drag_and_drop(start, end).perform()
            chapter = "#treeDemo > li:nth-child(%d)" % (index+1)
            print chapter
            sleep(1)
            driver.find_element_by_css_selector(chapter).click()
            sleep(1)
            if number <= 2:
                text1 = driver.find_element_by_css_selector("#wall-act- > div > table > tbody > tr > td:nth-child(2) > span").text
                text2 = driver.find_element_by_css_selector("#wall-act- > div > table > tbody > tr > td:nth-child(3) > span").text
            else:
                text1 = driver.find_element_by_css_selector("#parallels-act-list > div > table > tbody > tr > td:nth-child(2) > span").text
                text2 = driver.find_element_by_css_selector("#parallels-act-list > div > table > tbody > tr > td:nth-child(3) > span").text
            text1 = int(text1.split(u"分")[0].strip())
            text2 = int(text2.split(u"分")[0].strip())
            print text1
            print text2
            if text1+5 < text2:
                driver.find_element_by_link_text(u"观看").click()
                try:
                    n = 1
                    while driver.find_element_by_css_selector("div.vjs-big-play-button").is_displayed():
                        driver.find_element_by_css_selector("div.vjs-big-play-button").click()
                        sleep(5)
                        n += 1
                        print "click ", n
                        if n == 5:
                            n = 1
                            driver.find_element_by_link_text(u"返回").click()
                            sleep(1)
                            driver.find_element_by_link_text(u"观看").click()
                except:
                    print 'click start button success'
                return

    def tearDown(self):
        self.driver.quit()

if __name__ == "__main__":
    unittest.main()


多次修改,最终的代码如上所示
因为用appium和uiautomator使用也比较熟练,也因为之前学过selenium但是忘得差不多了,所以我想偷个懒,直接用selenium ide直接录制后,导出脚本直接修改修改就好了。
谁知道,selenium ide和原本的firefox不匹配。找到ide不能使用的原因,足足花了两三个小时。心累。
使用了旧版本的firefox,最后启动的时候,默认的firefox就是起不来。
最后不得不使用chrome启动。就是chromedirver要放在环境变量中。
之后就是看课程过程中的一些坑。
1.进入视频界面,点击开始图标就是不行,而且,用is_displayed()函数来判断是否存在,判断是存在的,点击了,就是不开始,后来在脚本启动后,脚本点击没有成功,我用鼠标点,也没有点成功。趁着sleep的时间,退出再进就成功了。其中用到了,捕捉异常,点击五次不成功,点击退出再进。
2.在uiautomator中,有一个wait.exists(timeout=)的函数,我知道selenium中也一定有这样的函数,就是不知道具体是什么,最后用了按了个点,一个一个查看来选出来的。找到了is_displayed()只可惜他和appium中的一样,如果element不存在,脚本就会报错。所以只能用异常来处理。
3.在一个利用到滑块的地方,要使用ActionChains函数。
也是selenium的一个自带from selenium.webdriver.common.action_chains import ActionChains
4.第三门课程开始,不在页面中了,需要滑动滑块。之后想到的解决方法就是页面缩放,真的是,使用组合键,使用了好多方法都没有成功,最终还是用了js来执行页面缩放,只是这样的话,就只是在当前页面会缩放,下面一个页面就不会缩放了。
5.第三第四门课程和前面两门课程,进入后的界面不一样,所以,又开始调整脚本,添加了一个参数,一是选第三个就要缩放界面,第二个就是因为后面两个课程的界面不一样,而重新添加了脚本。
6由参数引申出来的就是,我写了一个函数,findcourse,但是里面也要用到主函数中的number这个参数,如果我在findcouse中再定义一个,我就要每次改两个地方(最终我还是用了这个方法,没有找到好方法),让number成为global也不行。
7.本来想不用函数直接运行,以前遇到了一个情况也相同,只有一个入口,但是这个入口不能多次开启,开启一次,别的地方无法调用。


TAG:

引用 删除 SunnyLan   /   2016-09-14 17:07:50
5
 

评分:0

我来说两句

Open Toolbar