python+selenium获取禅道所有Bug标题

摘要:
前言:对于一组多数据,一个页面无法完全加载,需要在页面中加载。例如,禅宗中的bug数默认为20。此时,有第二页、第三页等等。如果我想获得所有bug标题,该怎么办?首先定位此元素,然后通过常规提取获得以下“3”。具体代码如下:b=self。驾驶员find_element_by_xpathpage=re.findall(r'/(.+?

前言:

对于一组很多的数据,一个页面加载不完,需要分页加载,比如禅道的Bug数,一页默认是20个(自己可以根据需求更改),这时就有了第二页,第三页等等。

这时如果要获取所有的Bug标题来怎么做呢?

点击下一页Bug,你会发现url的变化,就只有最后一个数字改变,如下图:

python+selenium获取禅道所有Bug标题第1张

python+selenium获取禅道所有Bug标题第2张

大体思路:

获取所有url→ddt驱动获取每一页的数据

步骤:

第一步:获取所有url

这里已经显示了总共有几页和当前所在的页面数,我们要获取的就后面的数字 ‘3’。

先定位到这个元素,在通过正则取出后面的 ‘3’,具体代码如下:

python+selenium获取禅道所有Bug标题第3张

b=self.driver.find_element_by_xpath(".//*[@id='bugList']/tfoot/tr/td/div[2]/div/strong[2]")
page=re.findall(r'/(.+?)',b.text)
total_page=page[0]
print('总共的页数:',total_page)

接下来就是要用到range函数了,获取所有的url地址了,代码如下:

for i in range(1,int(total_page)+1):
  Url=url+'/zentao/bug-browse-1--unclosed-0--60-20-%s.html' % i
  print(Url)

最后控制台输出如下:

python+selenium获取禅道所有Bug标题第4张

观察下,是不是只有后面的1,2,3在跟着变,其他无任何变化,这时就可以将这些url添加到一个list中去,用做接下来的ddt驱动的数据了

具体代码如下:

#coding:utf-8
from selenium.webdriver.firefox.webdriver import WebDriver as Firefox
import re,time
from selenium.webdriver.support.ui import WebDriverWait
class GetUrl():
    '''获取所有URL页面'''
    def get_url(self,url,username,psw):
        self.driver=Firefox()
        self.driver.maximize_window()
        self.driver.set_page_load_timeout(20)
        self.driver.implicitly_wait(20)
        self.driver.get(url+'/zentao/user-login-L3plbnRhby8=.html') #输入网址
        WebDriverWait(self.driver,20,1).until(lambda x:x.find_element_by_id("account")).send_keys(username) #输入账号
        WebDriverWait(self.driver,20,1).until(lambda x:x.find_element_by_name("password")).send_keys(psw)   #输入密码
        WebDriverWait(self.driver,20,1).until(lambda x:x.find_element_by_id('submit')).click()              #点击登录按钮
        time.sleep(2)
        self.driver.find_element_by_xpath(".//*[@id='mainmenu']/ul/li[4]/a").click()
        time.sleep(2)
        self.driver.find_element_by_xpath(".//*[@id='modulemenu']/ul/li[2]/a").click()
        time.sleep(2)
        table=self.driver.find_element_by_id('bugList')  #获取到bugList这个表格
        table_rows=table.find_elements_by_tag_name('tr') #获取行数
        print(('每一页数据的条数:'),(len(table_rows)-2))    #这里减2是减去表格最上面和最下面那行
        b=self.driver.find_element_by_xpath(".//*[@id='bugList']/tfoot/tr/td/div[2]/div/strong[2]") #定位到页面显示总页数那个元素(1/3)
        page=re.findall(r'/(.+?)',b.text)  #通过正则取出后面那个总页数(也就是那个3)
        total_page=page[0]
        print('总共的页数:',total_page)
        a=[]  #创建空list去接收生成的url
        for i in range(1,int(total_page)+1):
            Url=url+'/zentao/bug-browse-1--unclosed-0--60-20-%s.html' % i
            a.append(Url)  
        print(a)
        self.driver.close()
        return a
if __name__=='__main__':
    url='http://127.0.0.1'
    username='admin'
    psw='123456'
    a=GetUrl()
    a.get_url(url,username,psw)

第二步:编写另一个类来执行

1.导入第一步的url结果

 2.添加ddt驱动

3.将结果写入TXT中

具体代码如下:

#coding:utf-8
import unittest
import ddt
import time
from com.Practice.test_geturl import GetUrl
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
url='http://127.0.0.1'
username='admin'
psw='123456'
test_url=GetUrl().get_url(url,username,psw)
@ddt.ddt
class Test(unittest.TestCase):
    '''获取所有Bug标题'''
    @ddt.data(*test_url)
    def test_01(self,test_url):
        self.driver = webdriver.Firefox()
        self.driver.get('http://127.0.0.1/zentao/user-login-L3plbnRhby8=.html')
        WebDriverWait(self.driver,20,1).until(lambda x:x.find_element_by_id("account")).send_keys('admin')
        WebDriverWait(self.driver,20,1).until(lambda x:x.find_element_by_name("password")).send_keys('123456')
        WebDriverWait(self.driver,20,1).until(lambda x:x.find_element_by_id('submit')).click()
        time.sleep(1)
        self.driver.get(test_url)
        a=self.driver.find_elements_by_xpath(".//*[@id='bugList']/tbody/tr/td[4]/a")
        for i in a:
            print(i.text)
            try:
                with open('zendao.txt','a') as f:
                    f.write(i.text+'
')  
            except Exception as msg:
                print('写入时出错啦:%s' % msg)     
        time.sleep(1)
    def tearDown(self):
        self.driver.close()

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

这里获取文本信息是通过table定位获取。

最后TXT打印结果(没截全):

python+selenium获取禅道所有Bug标题第5张

python+selenium获取禅道所有Bug标题第6张

python+selenium获取禅道所有Bug标题第7张

这个是一个优惠券生成的网址,也是分页显示,原理和上面大体相同。

结语:

 这个有点麻烦,应该还有更简单的方法。只可惜小白一枚,能力不足,暂时就只能先这样做了,欢迎大家提意见!!!

免责声明:文章转载自《python+selenium获取禅道所有Bug标题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MTF的倾斜边缘计算方法分配格充要条件的两种证明下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ArcGIS API for JavaScript 4.3 与ArcGIS Server联动使用【地图服务】

【前言】 有好些网友问我怎么使用Server发布的地图服务了,其实非常的简单。 我在这里先声明:不提供Server软件,需要的请自行使用互联网搜索资源; 不阐述Server如何发布各各种服务,但是我会给出官方的文档(点我),发布服务其实各种老教程都很多了。 【软件准备】 ·Windows 64位以上的系统,XP可以歇菜了,Server是64位原生软件...

nginx正向代理 (带着请求头)

当你获得云服务器之后, 你有这样一个需求:当你要访问一个url的时候,这个URL只能在人家的云服务器上访问(比如百度),所以你要买百度的BCC,你可能在想在BCC起服务,那样有点麻烦,直接使用nginx代理就可以解决问题了,因为url涉及到验证,所以要把请求头带上。 首先下载nginx apt-get install nginx 最后配置nginx配置文件...

第七部分(一) 动态渲染页面爬取(Selenium的使用)

Ajax分析和抓取方式,是JavaScript动态渲染页面的一种情形,可使用 requests 或 urllib 爬取数据。JavaScript动态渲染的页面不是只有Ajax一种,比如中国青年网 http://news.youth.cn/gn/ 的分页部分由JavaScript生成的,不是原始的HTML代码,但是不包含Ajax请求。又比如ECharts的...

[转]JAVA读取外部资源的方法

在java代码中经常有读取外部资源的要求:如配置文件等等,通常会把配置文件放在classpath下或者在web项目中放在web-inf下. 1.从当前的工作目录中读取: try { BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("wkdi...

linux svn命令具体解释

检測是否安装svn:svnserve --version svn服务的关闭:killall svnserve 创建svn库:svnadmin create /opt/svn/repos 配置自己主动启动:把svnserve -d -r /opt/svn/repos 放在/etc/rc.d/rc.local最后一行 启动svn: svnserve -d -...

Selenium Webdirver API(1)

Selenium Webdirver API 前提:引入webdriver包 from selenium import webdriver 1、创建浏览器对象driver = webdriver.Ie(executable_path="D:\IEDriverServer")#不同浏览器只需更改浏览器名称即可,如:webdriver.Chrome() web...