按关键词阅读:
别喷 , 我知道代码健壮性不行 , 也知道没有什么高可用性 。 但是这只是我作为一个新手一天的成果而已 , 又不是学不会 , 后面慢慢就补上了 。
代码解释还记得多少就解释多少吧 。
第一个坑:find_element_name最开始的时候 , 我的代码并不是像上面那套写的 , 是这类的:
···name_in = driver.find_element_by_name('···')teacher.send_keys('····')pwd_in = driver.find_element_by_name('···')assistant.send_keys('····')time.sleep(1)button = driver.find_element_by_class_name('···')time.sleep(1)button.click()time.sleep(1)driver.close()1234567891011好家伙 , 报什么错呢?NoSuchFrameException: Message: no such frame
好家伙 , 我虽然没有身经百战 , 大大小小也数十战了吧 , 我果断的打开了百度 , 一大堆的解决方案映入眼帘 , 我会眼花缭乱?会个球 , 我一眼就抓出了这堆凌乱的解决方案中的共同点 , 他们都在重复着一个标签名“ifraem” , 哎 , 不重要 , 反正就这几个字母的组合排列 。
说什么 , 是由于存在了标签页的切换 , 所以要先进入到那个标签页 , 只需要把那页的id或者class提出来做一个引导就好 。
呐 , 像这样:browser.switch_to_frame('新iframe')
嘿 , 你还真别说 , 我还就照做了 , 这也成了我一晚上崩溃的起点 。
第二个坑: switch_to_frame()哇 , 这个巨坑 。 一贴上去这行代码就显示被删掉了 , 然而我并不这么认为 , 于是 。。。
那么这个是怎么肥四呢?
这个函数确实是被弃用了 , 在我的不断努力之下 , 我找到了替代函数:switch_to.frame()
这个解决了就万事大吉了?
请绕回第一个问题 。
崩溃吗?当你以为自己正在过关斩将 , 一路高歌猛进的时候 , 突然发现自己原来还在原地打转 。
绕来绕去绕不出来 , 都大晚上的一两点了 , 我就果断的去睡了 。
睡之前 , 我思量再三 , 明天起来换cookies吧 。
cookies绕过登录验证 , 绕进了荒漠用cookies怎么绕我就不多说了 , 不会绕的请回到“第七天”开始 。
就直接说我绕过去之后得出了个什么玩意儿吧:
D:\pythonProject3\Scripts\python.exe C:/Users/asus/PycharmProjects/pythonProject3/main.py你知道吗?当我绕过了登录验证的时候 , 我心里还有一阵窃喜 , 嘿 , 小样儿 , 还不是让我过了 。 然后 , ‘pia’
12345678910111213141516171819202122232425262728293031323334353637
文章插图
后来想了想 , 还是回来用selenium了 。 为什么呢?首先肯定是有我的考量的 。 其次还是有我的考量的 , 最后是因为项目中的其他模块还要用到selenium呢 , 早晚都要面对 , 早死晚死都得死 。
迎来转机就在这山穷水尽之时 , 我抱着试一试的心态 , 直接搜“selenium操作金数据” 。。 死马当活马医了 , 你们猜怎么着?
文章插图
果然球都没查到哈哈哈哈哈
最后 , 迫于无奈 , 我又去换了套教程 , “selenium自动化测试操作Chrome” , 哎 , 翻来覆去翻来覆去 , 找到一个电科大的学长留给他的学弟们的偷懒脚本 , 我的天 , 终于帮我开张了(注意 , 此前我一步都没迈出去 , 连UI都摸不到)!!!
于是 , 就出现了文章开头那段代码 。
其实那段代码也不简单 , 并不是说改一下就完了 , 那么简单的早就搞好了 。
成功路前的磕磕碰碰其实我刚开始并不是写成这样的 , 刚开始我是写成C语言格式的 , 虽然我知道现在这个也是C语言风格的 , 谁要是跟我说这是面向对象 , 那我劝你回去学一下设计模式吧 。
# 本地Chrome浏览器设置方法class golden_data:def __init__(self):#这几行用于隐藏浏览器 , 但是会导致文件无法下载 , 所以暂时搁置#options = Options()#chrome_options.add_argument('--no-sandbox')# 解决DevToolsActivePort文件不存在的报错#options.add_argument('--disable-gpu')# 谷歌文档提到需要加上这个属性来规避bug#options.add_argument('blink-settings=imagesEnabled=false')# 不加载图片, 提升速度#options.add_argument('--headless')# 浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败获取句柄 , 登录 , 略过#收集表单数据def collect_data(self):#点击第一个问卷这里需要提高可拓展性first_block = self.wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="5fa54cff61936cdee3121fa5"]/div/a')))first_block.click()time.sleep(2)#点击‘数据’table_click = self.wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="entries_nav"]')))table_click.click() 这里曾经死活点不过去 , 后来发现是由于复制粘贴之后忘记把first_block改成table_click了time.sleep(2)#数据导出data_out = self.wait.until(EC.presence_of_element_located((By.XPATH, '/html/body/div[3]/div[1]/div[3]/div/div[2]/table/tbody/tr/td[15]'))) 这里曾经无法将数据导出 , 直接copy Xpath已经无法满足业务需求了注(1)data_out.click()time.sleep(60)#这里的等待时间有点不好控制这里曾经在函数写法改为类写法的时候出现超时 , 原因在于那时候我就放了10秒所以这里的速度就非常之受网络影响 , 此处应该应try···throw···#数据预下载data_fore_download = self.wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="export_job_modal"]/div/div/div[3]/div/a[1]')))data_fore_download.click()time.sleep(10)#数据下载data_download = self.wait.until(EC.presence_of_element_located((By.XPATH, '/html/body/div[3]/div[1]/div[3]/div/div[2]/table/tbody/tr/td[15]/table/tbody/tr/td/div[1]/span[2]/a[1]')))这里问题和上面一样 , 无法满足业务需求 , 不过有了上面做铺垫 , 所以这里解决起来就很快data_download.click()self.driver.close()test = golden_data()test.login_data()test.collect_data()123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
稿源:(未知)
【傻大方】网址:http://www.shadafang.com/c/111T313942020.html
标题:你要偷偷的学Python,然后惊呆所有人(第十二天)( 二 )