selenium2学习

自动化介绍:UI自动化测试

Selenium简介:测试web应用程序用户界面(ui)的常用框架
pip install selenium==2.53.6

#pip install selenium or pip install-U selenium
#python setup.py install
from selenium import selenium
python -m pydoc -p   #查看帮助文档

配置apache服务器:

将项目放入webapps下
bin目录下startup.bat启动服务器
浏览器输入:localhost:8080/login.jsp 访问,localhost可变本ip地址


操作浏览器:

#打开浏览器:导宝-打开浏览器-获取网址-关闭窗口
from selenium import webdriver #导入包

ie

driver=webdriver.Ie()

谷歌chromedriver

#引入chromedriver.exe
chromedriver = r"C:\Users\11111\AppData\Local\Google\Chrome\Application\chromedriver.exe"
driver=webdriver.Chrome(chromedriver)

火狐FireFox

driver=webdriver.Firefox()

窗口操作

driver.get(r'https://www.baidu.com/') #打开网址
time.sleep(second) #休眠second秒,需要import time包
driver.refresh() #刷新页面
driver.back() #返回上一页
driver.forward() #进入下一页
driver.maxmize_window() #窗口最大
driver.set_window_size(width,hight)  #指定窗口大小
driver.get_screenshot_as_file("path.jpg") #截取全屏定义图片位置&名字
driver.close() #关闭窗口
driver.quit() #关闭窗口,以进程的形式
driver.name    #获取浏览器名称
driver.page_source    #页面源码

加载插件

url=r"C:\Users\Administrator\AppData\Roaming\Mozilla\Firefox\Profiles\sgycpmyp.default"    #找到配置文件路径
profile=webdriver.FirefoxProfile(url)
driver=webdriver.Firefox(profile)

元素的定位:(element单数/elements复数)

element/By定位:

    from selenium.webdriver.common.by import By
        ~  .find_element(self, by=By.ID, value=None)
        ~  .find_element("id","kw")

id定位:

    from selenium import webdriver
        ~  .find_element_by_id(value)

name定位:

    from selenium import webdriver
        ~  .find_element_by_name(value)

class_name定位:

    from selenium import webdriver
        ~  .find_element_by_class_name(value)

css定位:

    from selenium import webdriver
    #代表id属性
    .代表class属性
        ~  .find_element_by_css_selector(value)
    标签
        ~  .find_element_by_css_selector("input")
    父子标签
        ~  .find_element_by_css_selector("input>input")
    标签属性
        ~  .find_element_by_css_selector("[name='kw']")
    标签组合
        ~  .find_element_by_css_selector("input.kw>input>a>tr#su")
    #通过层级关系
        #//form[id='form'']/span/input
    #通过逻辑运算不需要and
        # "input[id='kw'][name='wd']"
        # dri.find_element_by_css_selector("input[id='kw'][name='wd']").send_keys(u"哈哈") 

link_text定位:

    from selenium import webdriver
        ~  .find_element_by_link_text(value)

partial_link_text定位:

    from selenium import webdriver
        ~  .find_element_by_partial_link_text(value)

tag_name定位:

    from selenium import webdriver
        ~  .find_element_by_tag_name(value)

xpath定位:W3C标准,xpath同一级别多个标签从1开始

    from selenium import webdriver
        ~  .find_element_by_xpath(value)
    表达式:
        nodename    选取此节点所有子节点
        /    从根节点选取
        //    从匹配选择的当前节点选择文档中的节点,而不考虑他们的位置
        .    选取当前节点
        ..    选取当前节点的父节点
        @    选取属性
    
    
        
            HarryPotter<title>
            <author>JK.Rowling<author>
            <year>2005<year>
            <price>29.99<price>
        </book>
    </bookstore>
    /bookstore/book[1]
    /boolstore/book[last()]
    /bookstore/book[last()-1]
    /bookstore/book[postion()<3]
    driver.current_window_handle()     #获得当前窗口句柄    //title[@lang]
    //title[@lang='eng']
    /bookstore/book[price>35.00]
    /bookstore/book[price>35.00]/title
    标签:#input标签如果只有一个则可以不用[x]
    dri.find_element_by_xpath("/html/body/div/div/div/div/div/form/span/input")
    标签属性:
    dri.find_element_by_xpath("//input[@id='su']")
    超链接:
    dri.find_element_by_xpath("//a[@href='http://home.baidu.com']")
    标签属性组合
    dri.find_element_by_xpath("//input[@id='kw' and @class='s_ipt']") #属性组合的形式
    文本值定位:
    dri.find_element_by_xpath("//a[contains(text(),'新闻')]") #标签之间存在唯一的文本值
    模糊定位:
    dri.find_element_by_xpath("//a[contains(@href,'xueshu')]") #其他属性值过长时,可以使用此方法
    #网页中动态属性的定位
    #start-with()
    dri.find_element_by_xpath("//input[start-with(@name,'ti_trhao')]")
    #end-with()
    dri.find_element_by_xpath("//input[end-with(@name,'ti_trhao')]")
    #contains()
    dri.find_element_by_xpath("//input[contains(@id,'username')]")
    #多标签多属性组合式定位
    dri.find_element_by_xpath("//input[@id='kw1]//input[start-with(@id,'nice')]/div[1]/form[3]")
</code></pre> 
 <hr> 
 <h1>元素的属性值:</h1> 
 <p>元素.get_attribute(属性名) #获取定位到的元素的指定属性值<br> 元素.size #获取输入框尺寸<br> 元素.text #获取百度页面备案信息<br> 元素.tag_name #获取标签名<br> 元素.is_displayed() #返回元素是否可见(true/false)<br> driver.title #当前页面标题<br> driver.current_url #当前页面url</p> 
 <hr> 
 <h1>鼠标事件</h1> 
 <pre><code>from selenium.webdriver.common.action_chains import ActionChains
</code></pre> 
 <p>常用方法:<br> perform() #执行所有actionchains中的行为<br> move_to_element() #鼠标悬停<br> context_click() #右击鼠标<br> double_click() # 双击鼠标<br> drag_and_drop(source,target) #拖动鼠标</p> 
 <h2>鼠标悬停在搜索设置按钮上</h2> 
 <pre><code>    mouse=driver.find_element_by_link_text("设置"')
    ActionChains(driver).move_to_ element(mouse).perform()
</code></pre> 
 <hr> 
 <h1>键盘事件</h1> 
 <pre><code>from selenium.webdriver.common.keys import Keys
</code></pre> 
 <h2>删除/Backspace</h2> 
 <pre><code>send_keys(Keys.BACK_SPACE)
</code></pre> 
 <h2>空格/space</h2> 
 <pre><code>send_keys(Keys.SPACE)
</code></pre> 
 <h2>制表/tab</h2> 
 <pre><code>send_keys(Keys.TAB)
</code></pre> 
 <h2>回退/esc</h2> 
 <pre><code>send_keys(Keys.ESCAPE)
</code></pre> 
 <h2>回车/enter</h2> 
 <pre><code>send_keys(Keys.ENTER)
</code></pre> 
 <h2>全选/ctrl+a</h2> 
 <pre><code>send_keys(Keys.CONTROL,'a')
</code></pre> 
 <h2>复制/ctrl+c</h2> 
 <pre><code>send_keys(Keys.CONTROL,'c')
</code></pre> 
 <h2>剪切/ctrl+x</h2> 
 <pre><code>send_keys(Keys.CONTROL,'x')
</code></pre> 
 <h2>粘贴/ctrl+v</h2> 
 <pre><code>send_keys(Keys.CONTROL,'v')
</code></pre> 
 <h2>键盘F1...F12</h2> 
 <pre><code>send.keys(Keys.F1/F12)
</code></pre> 
 <hr> 
 <h1>等待</h1> 
 <h2>显式等待:</h2> 
 <pre><code>    from selenium.webdriver.support.ui  import WebDriverWait
    from selenium.webdriver.support.ui  import excepted_conditions as EC
    from selenium.webdriver.common.by import By
</code></pre> 
 <h3>判断元素Expected Conditions的使用场景有2种:</h3> 
 <p>直接在断言中使用<br> 与WebDriverWait配合使用,动态等待页面上元素出现或者消失<br> element=WebDriverWait.(driver,timeout,poll_friquency=0.5,ignored_exceptions=None)<br> driver:浏览器驱动<br> timeout=:最长超时时间<br> poll_frequency:检测的间隔<br> ignored_exceptions:超时后的异常信息,默认是NoSuchElementException<br> 方法注释::<br> until(method,message=' '):<br> notuntil(method,message=' '):<br> exception_conditions类方法注释::<br> title_is() #判断当前页面的title是否精确等于预期<br> title_contains() #判断当前页面的title是否包含预期字符串<br> presence_of_ele: ment_located() #判断某个元素是否被加到了dom树里,并不代表该元素一定可见<br> visibility_of_element_located() #判断某个元素是否可见.可见代表元素非隐藏,并且元素的宽和高都不等于0<br> visibility_of() #跟上面的方法做一样的事情,只是上面的方法要传入locator,这个方法直接传定位到的element就好了<br> presence_of_all_elements_located() #判断是否至少有1个元素存在于dom树中。举个例子,如果页面上有n个元素的class都是'column-md-3',那么只要有1个元素存在,这个方法就返回True<br> text_to_be_present_in_element() # 判断某个元素中的text是否包含了预期的字符串<br> text_to_be_present_in_element_value() # 判断某个元素中的value属性是否包含了预期的字符串<br> frame_to_be_available_and_switch_to_it() # 判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False<br> invisibility_of_element_located() # 判断某个元素中是否不存在于dom树或不可见<br> element_to_be_clickable() # 判断某个元素中是否可见并且是enable的,这样的话才叫clickable<br> staleness_of() # 等某个元素从dom树中移除,注意,这个方法也是返回True或False<br> element_to_be_selected() # 判断某个元素是否被选中了,一般用在下拉列表<br> element_selection_state_to_be() # 判断某个元素的选中状态是否符合预期<br> element_located_selection_state_to_be() # 跟上面的方法作用一样,只是上面的方法传入定位到的element,而这个方法传入locator<br> alert_is_present() # 判断页面上是否存在alert</p> 
 <h2>隐式等待:</h2> 
 <p>driver.implicitly_wait(seconds)<br> Sleep休眠方法:<br> import time</p> 
 <h3>selenium中的三种等待方式(显示等待WebDriverWait()、隐式等待implicitly()、强制等待sleep()):</h3> 
 <p>sleep(): 强制等待,设置固定休眠时间。 python 的 time 包提供了休眠方法 sleep() , 导入 time 包后就可以使用 sleep(),进行脚本的执行过程进行休眠。<br> implicitly_wait():隐式等待,也叫智能等待,是 webdirver 提供的一个超时等待。隐的等待一个元素被发现,或一个命令完成。如果超出了设置时间的则抛出异常。<br> WebDriverWait():显示等待,同样也是 webdirver 提供的方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。默认检测频率为0.5s,默认抛出异常为: NoSuchElementException<br> python selenium 显示等待WebDriverWait与条件判断expected_conditions举例:</p> 
 <pre><code>    #coding=utf-8  
    from selenium import webdriver  
    from selenium.webdriver.common.by import By  
    from selenium.webdriver.support import expected_conditions as EC  
    from selenium.webdriver.support.wait import WebDriverWait  

    driver.implicitly_wait(5)  
        '''''隐式等待和显示等待都存在时,超时时间取二者中较大的'''   
    WebDriverWait(driver,10).until(EC.title_is(u"百度一下,你就知道"))  
        '''''判断title,返回布尔值'''  
  
    WebDriverWait(driver,10).until(EC.title_contains(u"百度一下"))  
        '''''判断title,返回布尔值'''  
  
    WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,'kw')))  
        '''''判断某个元素是否被加到了dom树里,并不代表该元素一定可见,如果定位到就返回WebElement'''  
  
    WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.ID,'su')))  
        '''''判断某个元素是否被添加到了dom里并且可见,可见代表元素可显示且宽和高都大于0'''  
  
    WebDriverWait(driver,10).until(EC.visibility_of(driver.find_element(by=By.ID,value='kw')))  
        '''''判断元素是否可见,如果可见就返回这个元素'''  
  
    WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'.mnav')))  
        '''''判断是否至少有1个元素存在于dom树中,如果定位到就返回列表'''  
  
    WebDriverWait(driver,10).until(EC.visibility_of_any_elements_located((By.CSS_SELECTOR,'.mnav')))  
        '''''判断是否至少有一个元素在页面中可见,如果定位到就返回列表'''  
  
    WebDriverWait(driver,10).until(EC.text_to_be_present_in_element((By.XPATH,"//*[@id='u1']/a[8]"),u'设置'))  
        '''''判断指定的元素中是否包含了预期的字符串,返回布尔值'''  
    WebDriverWait(driver,10).until(EC.text_to_be_present_in_element_value((By.CSS_SELECTOR,'#su'),u'百度一下'))  
        '''''判断指定元素的属性值中是否包含了预期的字符串,返回布尔值'''  
  
    #WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it(locator))  
        '''''判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False'''  
        #注意这里并没有一个frame可以切换进去 
  WebDriverWait(driver,10).until(EC.invisibility_of_element_located((By.CSS_SELECTOR,'#swfEveryCookieWrap')))  
        '''''判断某个元素在是否存在于dom或不可见,如果可见返回False,不可见返回这个元素'''  
        #注意#swfEveryCookieWrap在此页面中是一个隐藏的元素  
  
    WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//*[@id='u1']/a[8]"))).click()  
        '''''判断某个元素中是否可见并且是enable的,代表可点击'''  
        driver.find_element_by_xpath("//*[@id='wrapper']/div[6]/a[1]").click()  
        #WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//*[@id='wrapper']/div[6]/a[1]"))).click()  
  
    #WebDriverWait(driver,10).until(EC.staleness_of(driver.find_element(By.ID,'su')))  
        '''''等待某个元素从dom树中移除'''  
        #这里没有找到合适的例子  
  
    WebDriverWait(driver,10).until(EC.element_to_be_selected(driver.find_element(By.XPATH,"//*[@id='nr']/option[1]")))  
        '''''判断某个元素是否被选中了,一般用在下拉列表'''  
  
    WebDriverWait(driver,10).until(EC.element_selection_state_to_be(driver.find_element(By.XPATH,"//*[@id='nr']/option[1]"),True))  
        '''''判断某个元素的选中状态是否符合预期'''  
  
    WebDriverWait(driver,10).until(EC.element_located_selection_state_to_be((By.XPATH,"//*[@id='nr']/option[1]"),True))  
        '''''判断某个元素的选中状态是否符合预期'''  
        driver.find_element_by_xpath(".//*[@id='gxszButton']/a[1]").click()  
  
    instance = WebDriverWait(driver,10).until(EC.alert_is_present())  
        '''''判断页面上是否存在alert,如果有就切换到alert并返回alert的内容'''  
        print instance.text  
        instance.accept()
</code></pre> 
 <hr> 
 <h1>多表单切换:</h1> 
 <pre><code>location=driver.findelement(locator)
switch_to.frame(id/name/location)
switch_to_frame()
switch_to.parent_content()    #跳出当前一级表单
switch_to.default_content()     #跳回最外面页面
dri.switch_to_default_content()    #跳回当前默认窗口
</code></pre> 
 <hr> 
 <h1>多窗口切换:</h1> 
 <pre><code>driver.window_handles()     #获取打开窗口的句柄
driver.switch_to.window(handle)     #用于切换到相应的窗口
switch_to_window
</code></pre> 
 <hr> 
 <h1>上传文件:</h1> 
 <p>import SendKeys<br> 示例网址:http://www.sahitest.com/demo/php/fileUpload.htm<br> input标签:<br> input输入框:<br> 元素.sendkeys(r"path")<br> input非输入框→input按钮:<br> SendKeys.SendKeys(r"path") # 发送文件地址,在输入法不是系统默认的输入发时候,路径的输入可能在第三方输入法的输入框中<br> time.sleep(1)<br> SendKeys.SendKeys("{ENTER}") # 发送回车键<br> AutoiIt:<br> https://www.autoitscript.com/site/autoit/downloads/<br> AutoiIt window info #识别控件信息<br> Scite script editor #编辑脚本<br> 脚本方法:<br> ControlFocus("title","窗口文本",controlID) #设置输入焦点到指定窗口的某个控件上<br> WinWait("title题","窗口文本",超时时间) #暂停脚本的执行直至指定窗口存在(出现)为止<br> ControlSetText("title","窗口文本",controlID,"新文本") #修改指定控件文本<br> Sleep(延迟)<br> ControlClick("title","窗口文本",控件ID,按钮,点击次数) #向指定控件发送鼠标点击命令<br> tools→go/F5 :执行<br> import os<br> os.system(au3脚本路径)</p> 
 <hr> 
 <h1>文件下载</h1> 
 <h2>FireFox下载:</h2> 
 <p>profile=webdriver.FireFox Profile () #获取 Profile<br> profile.set_preference("属性","值") #设置 Profile 属性<br> 属性:<br> browser.download.dir:指定下载路径<br> browser.download.folderList:设置成 2 表示使用自定义下载路径;设置成 0 表示下载到桌面;设置成 1 表示下载到默认路径<br> browser.download.manager.showWhenStarting:在开始下载时是否显示下载管理器<br> browser.helperApps.neverAsk.saveToDisk:对所给出文件类型不再弹出框进行询问<br> eg:<br> profile = webdriver.FirefoxProfile()<br> profile.set_preference('browser.download.dir', 'd:\')<br> profile.set_preference('browser.download.folderList', 2)<br> profile.set_preference('browser.download.manager.showWhenStarting', False)<br> profile.set_preference('browser.helperApps.neverAsk.saveToDisk', 'application/zip')<br> driver = webdriver.Firefox(firefox_profile=profile)</p> 
 <h2>Charm下载:</h2> 
 <p>属性:<br> download.default_directory:设置下载路径<br> profile.default_content_settings.popups:设置为 0 禁止弹出窗口<br> eg:<br> options = webdriver.ChromeOptions()<br> prefs = {'profile.default_content_settings.popups': 0, 'download.default_directory': 'd:\'}<br> options.add_experimental_option('prefs', prefs)<br> driver = webdriver.Chrome(executable_path='D:\chromedriver.exe', chrome_options=options)</p> 
 <hr> 
 <h1>各种框处理:</h1> 
 <h2>下拉框:</h2> 
 <p>Select:<br> from selenium.webdriver.support.ui import Select<br> Select(driver.find_element("key","value")).select_by_index(self,index)<br> .select_by_visible_text(self,text)<br> .select_by_value(self,value)<br> e.g.<br> Select(driver.find_element_by_name("NR")).select_by_index(2)<br> Select(driver.find_element_by_name("NR")).select_by_visible_text("每页显示50条")<br> Select(driver.find_element_by_name("NR")).select_by_value('50')<br> Select类方法:<br> select_by_index() :通过索引定位<br> select_by_value() :通过value值定位<br> select_by_visible_text() :通过文本值定位<br> deselect_all() :取消所有选项<br> deselect_by_index() :取消对应index选项<br> deselect_by_value() :取消对应value选项<br> deselect_by_visible_text() :取消对应文本选项<br> first_selected_option() :返回第一个选项<br> all_selected_options() :返回所有的选项<br> CSS:<br> dri.find_element_by_css_selector("select#nr>option:nth-child(3)").click()<br> dri.find_element_by_css_selector("select#nr>option[@value='30']:nth-child()").click()<br> 定位父元素select(下面语句中的id=aaa),然后通过tag name找到所有option,得到option元素的数组,然后通过数组索引([1])定位,最后click:<br> driver.find_element_by_id("aaa").find_elements_by_tag_name("option")[1].click()<br> 跟第1条差不多思想,不过用option元素的value属性来定位了,下面代码是通过xpath来写的,可以换成 by_css:<br> driver.find_element_by_xpath("//select[@id='aaa']").find_element_by_xpath("//option[@value='5PM']").click()</p> 
 <h2>弹框(警告框处理):</h2> 
 <p>switch_to.alert()<br> switch_to_alert() #定位到弹框<br> text #获取弹框文本<br> accept() #接受/确定弹框<br> dismiss() #解散/关闭弹框<br> send_keys(value) #发送文本至弹框<br> eg:<br> dt=driver.switch_to_alert() / dt=driver.switch_to.alert()<br> dt.accept()</p> 
 <h2>复选框:</h2> 
 <p>driver.find_element_by_css_selector("span#li>input:nth-child(2)").click()<br> .pop().click() #最后一个点击<br> .pop(-1):默认获取一组元素的最后一个<br> .pop(0):默认获取一组元素的第一个<br> .pop(1):默认获取一组元素的第二个<br> list=dri.find_elements_by_xpath("//*[@type='checkbox']") #获取所有框<br> print list<br> for x in list:<br> if x.get_attribute("value")=="lan": #选择符合条件的框<br> x.click()<br> dri.find_element_by_css_selector("span#li>input:nth-child(2)").is_selected() #是否被选</p> 
 <hr> 
 <h1>抓捕异常:</h1> 
 <pre><code>from selenium.common.exceptions import *
try:
    ...
except Exception,e:
    ...
else:
    ...
(finally:)
    ...
</code></pre> 
 <hr> 
 <h1>JS定位:</h1> 
 <pre><code>document.getElementById("id")
document.getElementsByName("name")[0].value="test"      返回列表,如果只有一个取下标0
document.getElementsByTagName("tag")
document.getElementsByClassName("class")
document.querySelectorAll()
eg:
jsusename='document.getElementById("account").clear()'
dri.execute_script(jsusename)
jspassword='document.getElementById("account").value="admin"'
dri.execute_script(jspassword)
</code></pre> 
 <h2>JS日期:</h2> 
 <pre><code>#移除属性
js='document.getElementById("train_date").removeAttribute("readonly");'
dri.execute_script(js)
#jQuery方法移除属性
# js="$('input[id=train_date]').removeAttr('readonly')"     #1移除属性
# js="$('input[id=train_date]').Attr('readonly',false)"     #2设置为false
# js="$('input[id=train_date]').removeAttr('readonly','')"     #3设置为空,同2
#用js方法输入日期
time.sleep(5)
jsdate='document.getElementById("train_date").value="2018-05-01"'
dri.execute_script(jsdate)
</code></pre> 
 <hr> 
 <h1>单元测试:</h1> 
 <pre><code>#test方法必须 要以test开头
import unittest
class IntegerArithmeticTestCase(unittest.TestCase):
    def setUp(self):
        self.dri = webdriver.Firefox()
        self.dri.get(r"https://www.baidu.com/")
        time.sleep(3)
    def tearDown(self):
        time.sleep(3)
        self.dri.close()
    def testlogin(self):
        self.dri=webdriver.Firefox()
        self.dri.get(r"https://www.baidu.com/")
        self.dri.find_element_by_id("kw").send_keys("test")
        time.sleep(3)
        self.dri.find_element_by_id("su").click()
        time.sleep(3)
        titles=self.dri.title
        self.assertEqual(titles,u"test_百度搜索")

if __name__=='__main__':
    unittest.main()
</code></pre> 
 <p>① setup():每个测试函数运行前运行<br> ② teardown():每个测试函数运行完后执行<br> ③ setUpClass():必须使用@classmethod装饰器,所有test运行前运行一次<br> ④ tearDownClass():必须使用@classmethod装饰器,所有test运行完后运行一次</p> 
 <h2>单元测试用例:</h2> 
 <pre><code>import unittest
import HTMLTestRunner
class Reports(unittest.TestCase):
    def testpanduan01(self):
        self.assertEqual(1,6)
    def testpanduan02(self):
        self.assertIn("aaa","aaaaabbbbbccccdddd")
if __name__=="__main__":
    # 指定执行测试用例
    testunit=unittest.TestSuite()
    testunit.addTest(Reports("testpanduan01"))
    testunit.addTest(Reports("testpanduan02"))
    #增加时间
    now=timereport=time.strftime("%Y%m%d%S%M%S")
    uu="panduanReport.html"
    print timereport+uu
    # fp=open(now+"panduanReport.html","w")
    # 写测试报告
    fp=open("panduanReport"+now+".html","w")
    runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title=u"测试报告书",description=u"这是测试报告的描述")
    runner.run(testunit)
</code></pre> 
 <p>断言语法 解释<br> assertEqual(a, b) 判断a==b<br> assertNotEqual(a, b) 判断a!=b<br> assertTrue(x) bool(x) is True<br> assertFalse(x) bool(x) is False<br> assertIs(a, b) a is b<br> assertIsNot(a, b) a is not b<br> assertIsNone(x) x is None<br> assertIsNotNone(x) x is not None<br> assertIn(a, b) a in b<br> assertNotIn(a, b) a not in b<br> assertIsInstance(a, b) isinstance(a, b)<br> assertNotIsInstance(a, b)</p> 
 <h2>单元测试修饰器:</h2> 
 <pre><code>class login(unittest.TestCase):
#setup().teardowm()每个用例都执行,+class后添加修饰器@classmethod...之开始结束执行一次
    # def setUp(self):
    @classmethod
    def setUpClass(cls):
        cls.dri=webdriver.Firefox()
        cls.dri.get(r"https://www.baidu.com/")
        print "start*******************"
    # def tearDown(self):
    @classmethod
    def tearDownClass(cls):
        cls.dri.close()
        print "%%%%%%%%%%%%%%%%%%%%%end"
    @unittest.skip("msg") #跳过测试用例
    def test001(self):
        print "this is num1"
    def test002(self):
        print "this is num2"
#test用例执行顺序.根据ASCLL
#   0-9  A-Z    a-z
</code></pre> 
 <h2>等待:</h2> 
 <pre><code>from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
</code></pre> 
 <hr> 
 <h1>操作excel:</h1> 
 <p>import xlrd</p> 
 <h2>打开excel文件</h2> 
 <p>data=xlrd.open_workbook("test.xlsx")</p> 
 <h2>获取指定sheet</h2> 
 <p>table=data.sheets()[0]<br> table=data.sheet_by_index(0)<br> table=data.sheet_by_name("Sheet1")</p> 
 <h2>row行 col列</h2> 
 <h3>行数a</h3> 
 <p>a=table.nrows</p> 
 <h3>列数b</h3> 
 <p>b=table.ncols</p> 
 <h3>第一行的值</h3> 
 <p>table.row_values(0)</p> 
 <h3>第一列的值</h3> 
 <p>table.col_values(0)</p> 
 <h2>python读取Excel实例</h2> 
 <p>(1)安装python官方Excel库-->xlrd<br> (2)获取Excel文件位置并读取<br> (3)读取sheet<br> (4)读取指定rows和cols内容</p> 
 <h2>DDt:</h2> 
 <p>import ddt<br> data=[存放字典数据n对]<br> 类名前用修饰器@ddt.ddt<br> class Ddtdemo(unittest.TestCase):<br> 测试用例test<em>前用修饰器@ddt.data(</em>data) *data 表示传入所有的数据<br> def testdemo(self,data):</p> 
 <h2>data从excel读取数据文件:</h2> 
 <p>data1=filesname.classname("init参数文件") init参数文件是读取文件方法类的传入参数<br> data=filesname.classname.waysname(data1)</p> 
 <p>range() 函数可创建一个整数列表,一般用在 for 循环中<br> range(start, stop[, step])<br> start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);<br> stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5<br> step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)</p> 
 <h2>python的ConfigParser模块:</h2> 
 <p>该模块的作用 就是使用模块中的RawConfigParser()、ConfigParser()、 SafeConfigParser()这三个方法(三者择其一),创建一个对象使用对象的方法对指定的配置文件做增删改查 操作。<br> 在调用这三个函数时,切记这三个函数会将调用optionxform(),在传递键值对数据时,会将键名 全部转化为小写:<br> RawConfigParser():<br> ConfigParser.RawConfigParser([defaults[, dict_type[, allow_no_value]]])<br> defaults : 如果指定默认值,则使用默认值的键值对<br> dict_type:使用新的section的键值对<br> allow_no_value :默认是False,如果是True,表示可以接收空值(None)<br> return:对象<br> ConfigParser():<br> ConfigParser.ConfigParser([defaults[, dict_type[, allow_no_value]]])<br> SafeConfigParser():<br> ConfigParser.SafeConfigParser([defaults[, dict_type[, allow_no_value]]])</p> 
 <h2>Python os.path 模块介绍:</h2> 
 <p>os.path.abspath(path) 返回path规范化的绝对路径(但这个路径不一定是真实的路径),如果path仅是一个文件名,使用该函数后返回的路径是当前工作目录路径连接改文件名后所组成的新的路径名。<br> os.path.split(path) 将path分割成目录和文件名二元组返回<br> os.path.dirname(path) 返回path的目录,其实就是os.path.split(path)的第一个元素<br> os.path.basename(path) 返回path最后的文件名。如果path以/或\结尾,就会返回空值。即os.path.split(path)的第二个元素。<br> os.path.commonprefix(list) 返回list中所有path共有的最长的路径,从左向右,相同字符。<br> os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False。<br> os.path.isabs(path) 如果path是绝对路径,返回True。<br> os.path.normpath(path) 规范path字符串形式(规范文件路径)<br> os.path.isfile(path) 判断路径是否为文件,是返回True,否则返回False<br> os.path.isdir(path) 如果path是一个存在的目录,返回True,否则返货False。<br> os.path.islink(path) 是否是链接;但如果系统不支持链接,则返回False。<br> os.path.join(path1 [, path2 [, ….]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略。<br> os.path.normcase(path) 在Linux下,该函数会原样返回path,在Windows平台上会将路径中所有的字符转换为小写,并将所有斜杠转换为反斜杠,同时将路径规范化。<br> os.path.splitdrive(path) 拆分驱动器和路劲,主要对win,对Linux元组第一个总是空的。<br> os.path.splitext(path) 分离文件名与扩展名;默认返回(fname, fextension)元组,可做分片操作,以” . “为分隔符。<br> os.path.getsize(filename) 返回文件的大小(单位字节),如果filename为目录返回0L<br> os.path.getatime(filename) 返回文件或目录的最后存取时间。<br> os.path.getctime(filename)返回浮点数的文件或目录的创建时间,在类Unix系统上是文件最近更改的时间,在Windows上是文件或目录的创建时间。<br> os.path.getmtime(filename) 返回文件或目录的最后修改时间<br> os.path.walk(top, func, arg):列出目录树下的目录路径和文件路劲<br> 参数说明:<br> top:表示需要遍历的目录树的路径<br> func:表示回调函数,对遍历路径进行处理。所谓回调函数,是作为某个函数的的参数使用,当某个时间触发时,程序将调用定义好的回调函数处理某个任务。回调函数必须提供3个参数:第1个参数为walk()的参数tag,第2个参数表示目录列表,第3个参数表示文件列表。<br> arg:是传递给回调参数func的元组.回调函数的一个参数必须是arg,为回调函数提供处理参数.参数arg可以为空。</p> 
 <hr> 
 <h1>编码格式:</h1> 
 <p>unicodeתutf-8:<br> import sys<br> reload(sys)<br> sys.setdefaultencoding('utf-8')</p> 
 <hr> 
 <h1>封装包的定义:</h1> 
 <p>封装:<br> common:基础方法<br> case:测试用例<br> page:配置,查找定位页面元素<br> exec.py顶层文件作为main函数,执行所有的测试用例<br> 我的定义:<br> page:页面定位元素,文本,弹框,文本值<br> case:测试用例<br> common:继承page类后的测试用例方法<br> source:资源配置设置与读取</p> 
</article>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1382472239357710336"></div>
                    <script type="text/javascript" src="/views/front/js/chanyan.js"></script>
                    <!-- 文章页-底部 动态广告位 -->
                    <div class="youdao-fixed-ad" id="detail_ad_bottom"></div>
                </div>
                <div class="col-md-3">
                    <div class="row" id="ad">
                        <!-- 文章页-右侧1 动态广告位 -->
                        <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_1"> </div>
                        </div>
                        <!-- 文章页-右侧2 动态广告位 -->
                        <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_2"></div>
                        </div>
                        <!-- 文章页-右侧3 动态广告位 -->
                        <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_3"></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="container">
        <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(selenium2学习)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1891996249633124352.htm"
                           title="情感分析研究综述:方法演化与前沿挑战" target="_blank">情感分析研究综述:方法演化与前沿挑战</a>
                        <span class="text-muted">next_travel</span>
<a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a>
                        <div>文章目录摘要abstract1.引言2.模型方法2.1文本情感分析2.1.1文档级情感分类2.1.2句子级情感分类2.1.3方面级情感分类2.2文本情感分析方法2.2.1基于词典的方法2.2.2基于机器学习的方法2.2.3基于深度学习方法2.3视觉情感分析2.4音频情感分析2.5多模态情感分析2.5.1图文方法2.5.2视听方法2.5.3音频-图像-文本方法3.情感分析的挑战3.1讥讽检测3.2模</div>
                    </li>
                    <li><a href="/article/1891995240005431296.htm"
                           title="AI 百炼成神:线性回归,预测房价" target="_blank">AI 百炼成神:线性回归,预测房价</a>
                        <span class="text-muted">github_czy</span>
<a class="tag" taget="_blank" href="/search/AI/1.htm">AI</a><a class="tag" taget="_blank" href="/search/%E7%99%BE%E7%82%BC%E6%88%90%E7%A5%9E%EF%BC%9A100/1.htm">百炼成神:100</a><a class="tag" taget="_blank" href="/search/%E4%B8%AA%E9%A1%B9%E7%9B%AE%E7%8E%A9%E8%BD%AC%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">个项目玩转人工智能</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>我们开始第一个项目——线性回归:预测房价。这是一个经典的机器学习入门项目,可以帮助你理解如何使用线性回归模型来预测连续的数值。第一个项目:线性回归预测房价项目目标学习线性回归的基本概念。使用历史房价数据建立一个预测模型。理解如何评估模型的性能。项目步骤准备数据集为了演示线性回归,我们将使用一个常见的房价数据集:波士顿房价数据集(BostonHousingDataset)。这个数据集包含了多个特征(</div>
                    </li>
                    <li><a href="/article/1891994735023812608.htm"
                           title="《人工智能所需的数学基础》:开启AI领域的数学之旅" target="_blank">《人工智能所需的数学基础》:开启AI领域的数学之旅</a>
                        <span class="text-muted">杨焕月Great</span>

                        <div>《人工智能所需的数学基础》:开启AI领域的数学之旅【下载地址】人工智能所需的数学基础人工智能所需的数学基础欢迎来到《人工智能所需的数学基础》资源页面项目地址:https://gitcode.com/open-source-toolkit/2af1b项目介绍在人工智能(AI)的广阔天地中,数学是不可或缺的基石。《人工智能所需的数学基础》资源包正是为了帮助那些渴望深入AI领域的学习者,提供一套系统、全</div>
                    </li>
                    <li><a href="/article/1891993853590827008.htm"
                           title="c++实现贪吃蛇游戏" target="_blank">c++实现贪吃蛇游戏</a>
                        <span class="text-muted">lyh不会打代码</span>
<a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E8%B4%AA%E5%90%83%E8%9B%87/1.htm">贪吃蛇</a><a class="tag" taget="_blank" href="/search/%E6%B8%B8%E6%88%8F%E7%AD%96%E5%88%92/1.htm">游戏策划</a>
                        <div>摘要:本文将介绍以C++编写贪吃蛇游戏的过程,包括游戏规则、设计思路、主要功能的实现以及注意事项。最后,我们给出了完整的C++代码,供读者参考和学习。目录引言游戏规则设计思路蛇的移动:食物生成:碰撞检测:画面绘制:具体实现注意事项最终代码总结引言贪吃蛇是一款经典的电子游戏,最初是在20世纪70年代普及的,现在已经成为了一种普遍的游戏形式。玩家操纵一个蛇,在屏幕上移动并吃掉食物,每吃掉一个食物,蛇就</div>
                    </li>
                    <li><a href="/article/1891993601022423040.htm"
                           title="基于基于强化学习(Q-Learning)用于底层动态频谱接入(DSA)认知无线电网络的资源分配研究(Matlab代码实现)" target="_blank">基于基于强化学习(Q-Learning)用于底层动态频谱接入(DSA)认知无线电网络的资源分配研究(Matlab代码实现)</a>
                        <span class="text-muted">长安程序猿</span>
<a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/matlab/1.htm">matlab</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>欢迎来到本博客❤️❤️博主优势:博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。⛳️座右铭:行百里者,半于九十。本文目录如下:目录⛳️赠与读者1概述一、动态频谱接入(DSA)的基本原理与挑战1.DSA的核心机制2.关键挑战二、Q-Learning在DSA资源分配中的应用框架1.算法原理2.典型应用场景三、关键参数与模型设计1.状态空间定义2.动作空间设计3.奖励函数设计四、研究进展与优化方法1.</div>
                    </li>
                    <li><a href="/article/1891985790402097152.htm"
                           title="VTK知识学习(32)-图像运算" target="_blank">VTK知识学习(32)-图像运算</a>
                        <span class="text-muted">无所谓จุ๊บ</span>
<a class="tag" taget="_blank" href="/search/VTK/1.htm">VTK</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/VTK/1.htm">VTK</a>
                        <div>1、数学运算vklmageMathematics提供了基本的一元和二元数学操作。根据不同的操作,需要一个或者两个输入图像。二元数学操作要求两个输入图像具有相同的像素数据类型和颜色组分。当两个图像大小不同时,输出图像的范围为两个输入图像范围的并集,并且原点和像素间隔与第一个输入图像保持一致。privatevoidTestMathematics(){//绘制一个暗红色矩形vtkImageCanvasS</div>
                    </li>
                    <li><a href="/article/1891982508489240576.htm"
                           title="【学习笔记】Python基础-字典Dict和Set和List与Str扩展" target="_blank">【学习笔记】Python基础-字典Dict和Set和List与Str扩展</a>
                        <span class="text-muted">法迪</span>
<a class="tag" taget="_blank" href="/search/Python%E5%9F%BA%E7%A1%80/1.htm">Python基础</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/hashmap/1.htm">hashmap</a><a class="tag" taget="_blank" href="/search/Dict/1.htm">Dict</a><a class="tag" taget="_blank" href="/search/set/1.htm">set</a><a class="tag" taget="_blank" href="/search/list/1.htm">list</a>
                        <div>Dict使用大括号围起来,这里提供一种键值对的list表示方法1.Dict{}2.List[]3.turple()实例代码#!/usr/bin/envpython3#-*-coding:utf-8-*-#字典dict类似Java的HashMap#Dict{}#List[]#turple()mDict={"Lava":90,"Huawei":100,"Sony":60}print(mDict['La</div>
                    </li>
                    <li><a href="/article/1891980615109111808.htm"
                           title="【隐私保护】身份认证的基本概念" target="_blank">【隐私保护】身份认证的基本概念</a>
                        <span class="text-muted">小oo呆</span>
<a class="tag" taget="_blank" href="/search/%E3%80%90%E9%9A%90%E7%A7%81%E4%BF%9D%E6%8A%A4%E3%80%91/1.htm">【隐私保护】</a><a class="tag" taget="_blank" href="/search/%E3%80%90%E5%AD%A6%E4%B9%A0%E5%BF%83%E5%BE%97%E3%80%91/1.htm">【学习心得】</a><a class="tag" taget="_blank" href="/search/%E5%AF%86%E7%A0%81%E5%AD%A6/1.htm">密码学</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a><a class="tag" taget="_blank" href="/search/%E9%9A%90%E7%A7%81%E4%BF%9D%E6%8A%A4/1.htm">隐私保护</a>
                        <div>在之前的文章中有提到认证技术,那么之前提到的认证技术和身份认证技术有什么不同呢?身份认证技术的到底是什么呢?如果想更系统的学习身份认证建议把之前的文章看看:【密码学】密码协议【密码学】密码协议的分类:②认证协议我认为认证技术是一个更广的概念,它指的是在计算机网络中确认操作者身份的过程以及确保数据完整性和来源可靠性的方法。也就是认证技术要认证三个东西:消息认证(验证消息的完整性)、数据源认证(验证消</div>
                    </li>
                    <li><a href="/article/1891976205154971648.htm"
                           title="推荐文章:md2pptx - Markdown到PowerPoint转换神器,让文档制作更简单!" target="_blank">推荐文章:md2pptx - Markdown到PowerPoint转换神器,让文档制作更简单!</a>
                        <span class="text-muted">邬情然Harley</span>

                        <div>推荐文章:md2pptx-Markdown到PowerPoint转换神器,让文档制作更简单!项目地址:https://gitcode.com/gh_mirrors/md/md2pptx在快节奏的工作和学习环境中,高效地整理和展示信息变得至关重要。今天,我们来聊聊一个开源宝藏工具——md2pptx,它能将简洁的Markdown格式文本轻松转化为专业的PowerPoint演示文稿。对于那些喜欢Mark</div>
                    </li>
                    <li><a href="/article/1891974566327152640.htm"
                           title="Python网络爬虫-WebSocket数据抓取" target="_blank">Python网络爬虫-WebSocket数据抓取</a>
                        <span class="text-muted">程序小勇</span>
<a class="tag" taget="_blank" href="/search/faiss/1.htm">faiss</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/1.htm">网络协议</a><a class="tag" taget="_blank" href="/search/websocket/1.htm">websocket</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>目录前言1、WebSocket请求的分析通常涉及以下几个方面:2、利用WebSocket爬取数据总结最后,创作不易!非常感谢大家的关注、点赞、评论啦!谢谢三连哦!好人好运连连,学习进步!工作顺利哦!博主介绍:✌专注于前后端、机器学习、人工智能应用领域开发的优质创作者、秉着互联网精神开源贡献精神,答疑解惑、坚持优质作品共享。本人是掘金/腾讯云/阿里云等平台优质作者、擅长前后端项目开发和毕业项目实战,</div>
                    </li>
                    <li><a href="/article/1891968635937812480.htm"
                           title="JVM内存优化的秘密武器:压缩指针详解" target="_blank">JVM内存优化的秘密武器:压缩指针详解</a>
                        <span class="text-muted">墨瑾轩</span>
<a class="tag" taget="_blank" href="/search/%E4%B8%80%E8%B5%B7%E5%AD%A6%E5%AD%A6Java%E3%80%90%E4%B8%80%E3%80%91/1.htm">一起学学Java【一】</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>关注墨瑾轩,带你探索编程的奥秘!超萌技术攻略,轻松晋级编程高手技术宝库已备好,就等你来挖掘订阅墨瑾轩,智趣学习不孤单即刻启航,编程之旅更有趣引言嘿,小伙伴们,我是你们的技术领航员zq啦!今天,咱们要一起探讨一个超棒的话题——JVM中的压缩指针技术。压缩指针就像是魔法中的缩小药水,能让原本庞大的指针变得小巧玲珑,从而节省宝贵的内存空间。别急,让我们慢慢揭开它的神秘面纱!正文一、刨根问底:压缩指针是什</div>
                    </li>
                    <li><a href="/article/1891968257292824576.htm"
                           title="C++Primer学习(4.6成员访问运算符)" target="_blank">C++Primer学习(4.6成员访问运算符)</a>
                        <span class="text-muted">黑果果的思考</span>
<a class="tag" taget="_blank" href="/search/%E9%9B%B6%E5%9F%BA%E7%A1%80%E5%AD%A6%E4%B9%A0C%2B%2B/1.htm">零基础学习C++</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a>
                        <div>4.6成员访问运算符点运算符和箭头运算符都可用于访问成员,其中,点运算符获取类对象的一个成员;箭头运算符与点运算符有关,表达式ptr->mem等价于(*ptr).mem:stringsl="astring",*p=&s1;auton=s1.size();//运行string对象s1的size成员n=(*p).size();//运行p所指对象的size成员n=p->size();//等价于(*p).</div>
                    </li>
                    <li><a href="/article/1891965985401925632.htm"
                           title="Unity UI优化总结" target="_blank">Unity UI优化总结</a>
                        <span class="text-muted">Don里个冬</span>
<a class="tag" taget="_blank" href="/search/Unity3D%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/1.htm">Unity3D技术分享</a><a class="tag" taget="_blank" href="/search/unity/1.htm">unity</a><a class="tag" taget="_blank" href="/search/unity3d/1.htm">unity3d</a><a class="tag" taget="_blank" href="/search/ugui/1.htm">ugui</a>
                        <div>UnityUI优化总结前言最近又再一次回顾总结了一下UnityUI的优化,在此作下笔记,供学习参考。核心四大问题在Unity中UI优化的核心问题就是重绘和批处理之间的平衡。虽然说可以通过一些简单的技巧单方面地减少批次或者减少重绘,但进行过一波优化之后,最终还是要面临批次和重绘的平衡问题的。常见的四大UI优化问题:1、片段着色器利用率过高(或者说GPUfill-rate填充率过高),即每个片段处理的</div>
                    </li>
                    <li><a href="/article/1891965733051625472.htm"
                           title="python 山脊图_(数据科学学习手札98)纯Python绘制满满艺术感的山脊地图" target="_blank">python 山脊图_(数据科学学习手札98)纯Python绘制满满艺术感的山脊地图</a>
                        <span class="text-muted">weixin_39780255</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%B1%B1%E8%84%8A%E5%9B%BE/1.htm">山脊图</a>
                        <div>1简介下面的这幅图可能很多读者朋友们都看到过,这是英国摇滚乐队JoyDivision在1979年发行的其第一张录音室专辑UnknownPleasures的封面,由艺术家PeterSaville基于射电脉冲星信号的数据图创作而成,成为了一种流行文化的符号标志。图1类似图1的风格,在地图制作中也存在着一种山脊地图,基于记录地表海拔信息的高程数据,我们可以利用水平方向上的基于实际位置海拔高度的曲线,来对</div>
                    </li>
                    <li><a href="/article/1891964977246433280.htm"
                           title="[学习笔记-SLAM篇]Ubuntu16.04+ROS下配置ORB-SLAM3——后续" target="_blank">[学习笔记-SLAM篇]Ubuntu16.04+ROS下配置ORB-SLAM3——后续</a>
                        <span class="text-muted">warningm_dm</span>
<a class="tag" taget="_blank" href="/search/SLAM%E7%AF%87/1.htm">SLAM篇</a>
                        <div>作为一篇后记,就主要做补充之用。索引1.编译不显示warning2.LocalMapping报错3.KannalaBrandt8报错4.RGB-D设置文件1.编译不显示warning编译的过程中有报错,但是一贯的,warning太多了,所以修改一下,便于找错。参考ubuntu18.04配置ORB-SLAM3。将ORB-SLAM3的CMakeLists.txt中的-Wall后面加上-w,可屏蔽编译的</div>
                    </li>
                    <li><a href="/article/1891963209171136512.htm"
                           title="【人工智能】AI现状分析 || 神经网络的数学基础 || 人工智能交叉领域的发展和技术应用 || 附:小白入门人工智能 学习步骤" target="_blank">【人工智能】AI现状分析 || 神经网络的数学基础 || 人工智能交叉领域的发展和技术应用 || 附:小白入门人工智能 学习步骤</a>
                        <span class="text-muted">追光者♂</span>
<a class="tag" taget="_blank" href="/search/Python%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">Python从入门到人工智能</a><a class="tag" taget="_blank" href="/search/%E7%99%BE%E9%A2%98%E5%8D%83%E8%A7%A3%E8%AE%A1%E5%88%92%28%E9%A1%B9%E7%9B%AE/1.htm">百题千解计划(项目</a><a class="tag" taget="_blank" href="/search/%E5%AE%9E%E6%88%98/1.htm">实战</a><a class="tag" taget="_blank" href="/search/%E6%A1%88%E4%BE%8B%EF%BC%89/1.htm">案例)</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E4%BA%A4%E5%8F%89%E9%A2%86%E5%9F%9F/1.htm">交叉领域</a><a class="tag" taget="_blank" href="/search/%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%E7%9A%84%E6%95%B0%E5%AD%A6%E5%9F%BA%E7%A1%80/1.htm">神经网络的数学基础</a><a class="tag" taget="_blank" href="/search/AI%E7%8E%B0%E7%8A%B6%E5%88%86%E6%9E%90/1.htm">AI现状分析</a>
                        <div>声明:仅学习使用~资料整理分析不易,点个赞吧!目录1.AI现状分析(人工智能基础入门概念)1.1人工智能基础概念1.2人工智能的技术发展路线1.3产业发展的驱动因素1.4人工智能薪资岗位介绍2.神经网络的数学基础2.1神经网络的生物表示2.2神经网络的数学表示2.3神经网络必备的一些数学基础2.3.1Sigmoid函数2.3.2偏置2.4总结3.人工智能交叉领域的发展和技术应用3.1人工智能应用交</div>
                    </li>
                    <li><a href="/article/1891960429316468736.htm"
                           title="嵌入式学习第十七天--fileio" target="_blank">嵌入式学习第十七天--fileio</a>
                        <span class="text-muted">嵌入式小黑子</span>
<a class="tag" taget="_blank" href="/search/linxu%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B/1.htm">linxu高级编程</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>fileIo文件操作:缓存操作对象具体操作标准IO全缓存/行缓存文件指针(流指针)FILE*1.打开--fopen(库函数)2.读写fgetc/fputcfgets/fputsfread/fwrite3.关闭fclose4.定位fseek/ftell/rewind空洞文件文件IO不带缓存文件描述符(整数)1.打开--open(系统调用)2.读写--read/write3.关闭--close4.定位</div>
                    </li>
                    <li><a href="/article/1891955260721786880.htm"
                           title="EasyX学习笔记1:线条" target="_blank">EasyX学习笔记1:线条</a>
                        <span class="text-muted">ͨৡۚۨC++ۨۚ࿐๊</span>
<a class="tag" taget="_blank" href="/search/C%2B%2B%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91%E3%80%90EasyX%E3%80%91/1.htm">C++游戏开发【EasyX】</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a>
                        <div>目录一、线条颜色1.`setlinecolor`-设置当前线条颜色2.`getlinecolor`-获取当前线条颜色二、线条样式1.`setlinestyle`-设置线条样式(宽度、类型等)三、绘制线条1.`line`-绘制两点间直线2.`lineto`-从当前位置画线到指定点3.`linerel`-相对当前位置画线4.`polyline`-绘制多段线四、其他函数1.`getlinestyle`-</div>
                    </li>
                    <li><a href="/article/1891954882500423680.htm"
                           title="Blender渲染模糊?掌握这些技巧,提升你的渲染质量!" target="_blank">Blender渲染模糊?掌握这些技巧,提升你的渲染质量!</a>
                        <span class="text-muted">LhcyyVSO</span>
<a class="tag" taget="_blank" href="/search/Blender/1.htm">Blender</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E6%B8%B2%E6%9F%93/1.htm">云渲染</a><a class="tag" taget="_blank" href="/search/%E5%8A%A8%E7%94%BB%E6%B8%B2%E6%9F%93/1.htm">动画渲染</a><a class="tag" taget="_blank" href="/search/blender/1.htm">blender</a><a class="tag" taget="_blank" href="/search/3d/1.htm">3d</a><a class="tag" taget="_blank" href="/search/3d%E6%B8%B2%E6%9F%93/1.htm">3d渲染</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E6%B8%B2%E6%9F%93/1.htm">云渲染</a><a class="tag" taget="_blank" href="/search/3d%E5%BB%BA%E6%A8%A1/1.htm">3d建模</a><a class="tag" taget="_blank" href="/search/%E6%B8%B2%E6%9F%93%E5%86%9C%E5%9C%BA/1.htm">渲染农场</a><a class="tag" taget="_blank" href="/search/%E5%8A%A8%E7%94%BB%E6%B8%B2%E6%9F%93/1.htm">动画渲染</a>
                        <div>随着Blender生态链越来越完善,越来越多的人开始学习Blender。然而,在使用Blender的过程中,许多小伙伴遇到了各种问题。比如:为什么blender渲染物品很糊?能让它们变得清晰吗?Blender渲染不出来,有时渲染出来了就闪退是什么原因?...下面小编就为大家解答Blender渲染中出现的一些常见问题,帮助你迅速提升渲染质量。1.为什么我的Blender渲染模糊?(1)检查“属性”面</div>
                    </li>
                    <li><a href="/article/1891954504480387072.htm"
                           title="【Python 学习 / 5】函数详解(定义、参数、作用域、lambda、内置函数)" target="_blank">【Python 学习 / 5】函数详解(定义、参数、作用域、lambda、内置函数)</a>
                        <span class="text-muted">卜及中</span>
<a class="tag" taget="_blank" href="/search/Python%E5%9F%BA%E7%A1%80/1.htm">Python基础</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>文章目录一、函数1.定义函数1.1基本函数定义1.2带参数的函数1.3带返回值的函数2.参数传递2.1位置参数2.2默认参数2.3可变参数2.3.1使用`*args`2.3.2使用`**kwargs`2.4参数的混合使用3.作用域3.1局部和全局变量3.2`global`关键字输出:3.3`nonlocal`关键字输出:4.lambda表达式4.1基本用法4.2与`map()`、`filter()</div>
                    </li>
                    <li><a href="/article/1891948582802616320.htm"
                           title="基于Web的手机模拟器的实现(含源文件)" target="_blank">基于Web的手机模拟器的实现(含源文件)</a>
                        <span class="text-muted">设计源码分享</span>

                        <div>欢迎添加微信互相交流学习哦!项目源码:https://gitee.com/oklongmm/biye设计说明书题目基于Web的手机模拟器的实现摘要随着信息技术的迅速发展,Web技术的应用越来越普及。除了常见的教学课件演示、实验动画模拟、过程仿真实现、可视化仿真及测试系统等方面的应用外,Web也因其浏览方便、实现技术相对简单、使用方式灵活等特点,开始涉及生活中的方方面面,为人们的生活带来越来越多的便</div>
                    </li>
                    <li><a href="/article/1891947448222412800.htm"
                           title="LeetCode解决方案集:编程与面试技能提升" target="_blank">LeetCode解决方案集:编程与面试技能提升</a>
                        <span class="text-muted">徐子贡</span>

                        <div>本文还有配套的精品资源,点击获取简介:LeetCode是一个编程训练平台,提供了大量编程题目,用于提升开发者的算法技能和面试准备。本文将探讨名为"some-leetcode-solutions"的开源项目,其中包括LeetCode问题的多种编程语言解决方案。这些解决方案由社区成员贡献,可用于学习不同思路和比较语言实现。开源项目遵循开源协议,允许自由使用和修改代码,鼓励知识共享。本文还强调了学习算法</div>
                    </li>
                    <li><a href="/article/1891946314548178944.htm"
                           title="Java利用itextpdf实现pdf文件生成" target="_blank">Java利用itextpdf实现pdf文件生成</a>
                        <span class="text-muted">小码农吗</span>
<a class="tag" taget="_blank" href="/search/%E6%97%A5%E5%B8%B8%E6%A0%8F%E7%9B%AE/1.htm">日常栏目</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/pdf/1.htm">pdf</a><a class="tag" taget="_blank" href="/search/ajax/1.htm">ajax</a>
                        <div>前言最近公司让写一个数据页面生成pdf的功能,找了一些市面代码感觉都太麻烦,就自己综合性整合了一个便捷的工具类,开发只需简单组装数据直接调用即可快速生成pdf文件。望大家一起学习!!!代码获取方式:资源下载下载源码后台私信(一键三连哦!!!)二、前期准备1、html模版(放置接口所在项目的resourcess/templates/)需要准备一个要看到的pdf模版,利用html代码形式简单输出,其中</div>
                    </li>
                    <li><a href="/article/1891930419025211392.htm"
                           title="conda更换环境版本(比如torch版本)" target="_blank">conda更换环境版本(比如torch版本)</a>
                        <span class="text-muted">挨打且不服66</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                        <div>找到想要的torch版本pytorch官网torch过往的版本创建新环境condacreate--namemyenvpython=3.8condaactivatemyenvconda虚拟环境中安装CUDA和CUDNN深度学习用显卡训练的时候,需要安装与显卡对应的cuda和cudnn。但不同的项目所支持的pytorch版本是不一样的,而pytorch版本和cuda版本之间又是互相依赖的,所以如果可以</div>
                    </li>
                    <li><a href="/article/1891930291702919168.htm"
                           title="一文读懂!深度学习 + PyTorch 的超实用学习路线" target="_blank">一文读懂!深度学习 + PyTorch 的超实用学习路线</a>
                        <span class="text-muted">a小胡哦</span>
<a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/pytorch/1.htm">pytorch</a>
                        <div>深度学习作为人工智能领域的核心技术,正深刻改变着诸多行业。PyTorch则是深度学习实践中备受青睐的框架,它简单易用且功能强大。下面就为大家详细规划深度学习结合PyTorch的学习路线。一、基础知识储备数学基础数学是很重要的!!!线性代数、概率论与数理统计、微积分是深度学习的数学基石。熟悉矩阵运算、概率分布、梯度计算等概念,能帮助理解深度学习模型的原理。例如,在神经网络中,矩阵乘法用于神经元之间的</div>
                    </li>
                    <li><a href="/article/1891930292613083136.htm"
                           title="流行编程语言全解析:优势、应用与短板" target="_blank">流行编程语言全解析:优势、应用与短板</a>
                        <span class="text-muted">a小胡哦</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/1.htm">c语言</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/swift/1.htm">swift</a><a class="tag" taget="_blank" href="/search/r%E8%AF%AD%E8%A8%80/1.htm">r语言</a>
                        <div>Python:优势Python以其简洁、易读的语法闻名,新手能快速上手。丰富的库和框架,能极大地提高开发效率。适用领域数据科学与分析:处理和分析大规模数据集,进行数据可视化。典型示例:Google用Python进行数据分析,处理海量数据以支持各种业务决策。机器学习与人工智能:构建和训练模型。典型示例:OpenAI在很多人工智能项目中广泛使用Python,如GPT系列模型的研发。网络爬虫:轻松从网页</div>
                    </li>
                    <li><a href="/article/1891924487520186368.htm"
                           title="【自学笔记】机器学习基础知识点总览-持续更新" target="_blank">【自学笔记】机器学习基础知识点总览-持续更新</a>
                        <span class="text-muted">Long_poem</span>
<a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a>
                        <div>提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录机器学习重点知识点总览一、机器学习基础概念二、机器学习理论基础三、机器学习算法1.监督学习2.无监督学习3.强化学习四、机器学习处理流程五、机器学习常见问题与解决方法六、机器学习应用领域总结机器学习重点知识点总览一、机器学习基础概念定义:机器学习是一种人工智能技术,通过对数据的学习和分析,让计算机系统自动提高其性能。本质:找到</div>
                    </li>
                    <li><a href="/article/1891924488451321856.htm"
                           title="开源echarts实现的BI数据可视化图表,总有你能用上的" target="_blank">开源echarts实现的BI数据可视化图表,总有你能用上的</a>
                        <span class="text-muted">2301_79125642</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>华为审批不通过天津企业待遇集锦211本硕985博找不到工作怎么办还在等华子车bu的保温呢,家被偷了【11.26更新】24届求职黑名单汇总贴记录一次被爆杀的字节面试经历25届日常实习求助,有开源项目经历和源码学习经历求求大家投下我们小米吧,被鸽麻了25日常实习点击就送的公司。。。二本鼠鼠2个多月秋招今天心酸结束秋招上岸,个人历程和面经总结理想一面美团成都到家-24届校招补招-不卷-急!!求求大家投下</div>
                    </li>
                    <li><a href="/article/1891924227775328256.htm"
                           title="解锁机器学习核心算法 | 逻辑回归:不是回归的“回归”" target="_blank">解锁机器学习核心算法 | 逻辑回归:不是回归的“回归”</a>
                        <span class="text-muted">紫雾凌寒</span>
<a class="tag" taget="_blank" href="/search/AI/1.htm">AI</a><a class="tag" taget="_blank" href="/search/%E7%82%BC%E9%87%91%E5%8E%82/1.htm">炼金厂</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E9%80%BB%E8%BE%91%E5%9B%9E%E5%BD%92/1.htm">逻辑回归</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/scikit-learn/1.htm">scikit-learn</a><a class="tag" taget="_blank" href="/search/matplotlib/1.htm">matplotlib</a>
                        <div>引言前面一篇文章我们介绍了机器学习算法中我们最先会接触到的算法——线性回归:机器学习的基石。今天我们继续学习机器学习中的另一个算法模型——逻辑回归(LogisticRegression)。一、逻辑回归:不是回归的“回归”在机器学习的庞大算法体系中,逻辑回归(LogisticRegression)虽然名字中带有“回归”,但却是一位不折不扣的“分类高手”,主要用于解决二分类问题,在众多领域发挥着关键作</div>
                    </li>
                    <li><a href="/article/1891918427208085504.htm"
                           title="联想E470 双GPU笔记本部署私有AI模型方案" target="_blank">联想E470 双GPU笔记本部署私有AI模型方案</a>
                        <span class="text-muted">月光技术杂谈</span>
<a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E5%88%9D%E6%8E%A2/1.htm">大模型初探</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/ChatGLM3/1.htm">ChatGLM3</a><a class="tag" taget="_blank" href="/search/%E8%81%94%E6%83%B3E470/1.htm">联想E470</a><a class="tag" taget="_blank" href="/search/Qwen-7B/1.htm">Qwen-7B</a><a class="tag" taget="_blank" href="/search/Phi-3-mini/1.htm">Phi-3-mini</a>
                        <div>背景:手上有一台联想E470的闲置笔记本,配置如下:(IntelHD620核显+NVIDIA920MX独显,i5-7200UCPU),想用它来部署并学习AI模型。考虑到电脑的性能限制,打算采用「量化模型+知识蒸馏」的低成本部署方案。一、硬件适配优化方案显存限制突破使用4-bit量化技术压缩模型,例如加载ChatGLM3-6B的INT4版本,显存需求可降至6GB310启用CPU-GPU混合推理(通过</div>
                    </li>
                                <li><a href="/article/3.htm"
                                       title="枚举的构造函数中抛出异常会怎样" target="_blank">枚举的构造函数中抛出异常会怎样</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/enum/1.htm">enum</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E4%BE%8B/1.htm">单例</a>
                                    <div>首先从使用enum实现单例说起。 
 
为什么要用enum来实现单例? 
这篇文章( 
http://javarevisited.blogspot.sg/2012/07/why-enum-singleton-are-better-in-java.html)阐述了三个理由: 
1.enum单例简单、容易,只需几行代码: 
 

public enum Singleton {
	INSTANCE;</div>
                                </li>
                                <li><a href="/article/130.htm"
                                       title="CMake 教程" target="_blank">CMake 教程</a>
                                    <span class="text-muted">aigo</span>
<a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a>
                                    <div>转自:http://xiang.lf.blog.163.com/blog/static/127733322201481114456136/ 
  
CMake是一个跨平台的程序构建工具,比如起自己编写Makefile方便很多。 
介绍:http://baike.baidu.com/view/1126160.htm 
本文件不介绍CMake的基本语法,下面是篇不错的入门教程: 
http:</div>
                                </li>
                                <li><a href="/article/257.htm"
                                       title="cvc-complex-type.2.3: Element 'beans' cannot have character" target="_blank">cvc-complex-type.2.3: Element 'beans' cannot have character</a>
                                    <span class="text-muted">Cb123456</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/Webgis/1.htm">Webgis</a>
                                    <div>  cvc-complex-type.2.3: Element 'beans' cannot have character 
    Line 33 in XML document from ServletContext resource [/WEB-INF/backend-servlet.xml] is i</div>
                                </li>
                                <li><a href="/article/384.htm"
                                       title="jquery实例:随页面滚动条滚动而自动加载内容" target="_blank">jquery实例:随页面滚动条滚动而自动加载内容</a>
                                    <span class="text-muted">120153216</span>
<a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a>
                                    <div><script language="javascript">
$(function (){
	var i = 4;$(window).bind("scroll", function (event){
		//滚动条到网页头部的 高度,兼容ie,ff,chrome
		var top = document.documentElement.s</div>
                                </li>
                                <li><a href="/article/511.htm"
                                       title="将数据库中的数据转换成dbs文件" target="_blank">将数据库中的数据转换成dbs文件</a>
                                    <span class="text-muted">何必如此</span>
<a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/dbs/1.htm">dbs</a>
                                    <div>旗正规则引擎通过数据库配置器(DataBuilder)来管理数据库,无论是Oracle,还是其他主流的数据都支持,操作方式是一样的。旗正规则引擎的数据库配置器是用于编辑数据库结构信息以及管理数据库表数据,并且可以执行SQL 语句,主要功能如下。 
1)数据库生成表结构信息: 
        主要生成数据库配置文件(.conf文</div>
                                </li>
                                <li><a href="/article/638.htm"
                                       title="在IBATIS中配置SQL语句的IN方式" target="_blank">在IBATIS中配置SQL语句的IN方式</a>
                                    <span class="text-muted">357029540</span>
<a class="tag" taget="_blank" href="/search/ibatis/1.htm">ibatis</a>
                                    <div>在使用IBATIS进行SQL语句配置查询时,我们一定会遇到通过IN查询的地方,在使用IN查询时我们可以有两种方式进行配置参数:String和List。具体使用方式如下: 
 
1.String:定义一个String的参数userIds,把这个参数传入IBATIS的sql配置文件,sql语句就可以这样写: 
 
 
 
<select id="getForms" param</div>
                                </li>
                                <li><a href="/article/765.htm"
                                       title="Spring3 MVC 笔记(一)" target="_blank">Spring3 MVC 笔记(一)</a>
                                    <span class="text-muted">7454103</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/mvc/1.htm">mvc</a><a class="tag" taget="_blank" href="/search/bean/1.htm">bean</a><a class="tag" taget="_blank" href="/search/REST/1.htm">REST</a><a class="tag" taget="_blank" href="/search/JSF/1.htm">JSF</a>
                                    <div>    
     自从 MVC 这个概念提出来之后 struts1.X  struts2.X   jsf 。。。。。 
这个view 层的技术一个接一个! 都用过!不敢说哪个绝对的强悍! 
要看业务,和整体的设计! 
 
     最近公司要求开发个新系统!</div>
                                </li>
                                <li><a href="/article/892.htm"
                                       title="Timer与Spring Quartz 定时执行程序" target="_blank">Timer与Spring Quartz 定时执行程序</a>
                                    <span class="text-muted">darkranger</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/bean/1.htm">bean</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/quartz/1.htm">quartz</a>
                                    <div>有时候需要定时触发某一项任务。其实在jdk1.3,java sdk就通过java.util.Timer提供相应的功能。一个简单的例子说明如何使用,很简单: 1、第一步,我们需要建立一项任务,我们的任务需要继承java.util.TimerTask package com.test; import java.text.SimpleDateFormat; import java.util.Date; </div>
                                </li>
                                <li><a href="/article/1019.htm"
                                       title="大端小端转换,le32_to_cpu 和cpu_to_le32" target="_blank">大端小端转换,le32_to_cpu 和cpu_to_le32</a>
                                    <span class="text-muted">aijuans</span>
<a class="tag" taget="_blank" href="/search/C%E8%AF%AD%E8%A8%80%E7%9B%B8%E5%85%B3/1.htm">C语言相关</a>
                                    <div>大端小端转换,le32_to_cpu 和cpu_to_le32   字节序  
http://oss.org.cn/kernel-book/ldd3/ch11s04.html 
        小心不要假设字节序. PC 存储多字节值是低字节为先(小端为先, 因此是小端), 一些高级的平台以另一种方式(大端)</div>
                                </li>
                                <li><a href="/article/1146.htm"
                                       title="Nginx负载均衡配置实例详解" target="_blank">Nginx负载均衡配置实例详解</a>
                                    <span class="text-muted">avords</span>

                                    <div>[导读] 负载均衡是我们大流量网站要做的一个东西,下面我来给大家介绍在Nginx服务器上进行负载均衡配置方法,希望对有需要的同学有所帮助哦。负载均衡先来简单了解一下什么是负载均衡,单从字面上的意思来理解就可以解  负载均衡是我们大流量网站要做的一个东西,下面我来给大家介绍在Nginx服务器上进行负载均衡配置方法,希望对有需要的同学有所帮助哦。 
负载均衡 
先来简单了解一下什么是负载均衡</div>
                                </li>
                                <li><a href="/article/1273.htm"
                                       title="乱说的" target="_blank">乱说的</a>
                                    <span class="text-muted">houxinyou</span>
<a class="tag" taget="_blank" href="/search/%E6%A1%86%E6%9E%B6/1.htm">框架</a><a class="tag" taget="_blank" href="/search/%E6%95%8F%E6%8D%B7%E5%BC%80%E5%8F%91/1.htm">敏捷开发</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95/1.htm">软件测试</a>
                                    <div>从很久以前,大家就研究框架,开发方法,软件工程,好多!反正我是搞不明白!   
这两天看好多人研究敏捷模型,瀑布模型!也没太搞明白.    
不过感觉和程序开发语言差不多,   
瀑布就是顺序,敏捷就是循环.    
瀑布就是需求、分析、设计、编码、测试一步一步走下来。而敏捷就是按摸块或者说迭代做个循环,第个循环中也一样是需求、分析、设计、编码、测试一步一步走下来。   
  
也可以把软件开发理</div>
                                </li>
                                <li><a href="/article/1400.htm"
                                       title="欣赏的价值——一个小故事" target="_blank">欣赏的价值——一个小故事</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/%E6%9C%89%E6%95%88%E8%BE%85%E5%AF%BC/1.htm">有效辅导</a><a class="tag" taget="_blank" href="/search/%E6%AC%A3%E8%B5%8F/1.htm">欣赏</a><a class="tag" taget="_blank" href="/search/%E6%AC%A3%E8%B5%8F%E7%9A%84%E4%BB%B7%E5%80%BC/1.htm">欣赏的价值</a>
                                    <div>  第一次参加家长会,幼儿园的老师说:"您的儿子有多动症,在板凳上连三分钟都坐不了,你最好带他去医院看一看。"  回家的路上,儿子问她老师都说了些什么,她鼻子一酸,差点流下泪来。因为全班30位小朋友,惟有他表现最差;惟有对他,老师表现出不屑,然而她还在告诉她的儿子:"老师表扬你了,说宝宝原来在板凳上坐不了一分钟,现在能坐三分钟。其他妈妈都非常羡慕妈妈,因为全班只有宝宝</div>
                                </li>
                                <li><a href="/article/1527.htm"
                                       title="包冲突问题的解决方法" target="_blank">包冲突问题的解决方法</a>
                                    <span class="text-muted">bingyingao</span>
<a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a><a class="tag" taget="_blank" href="/search/exclusions/1.htm">exclusions</a><a class="tag" taget="_blank" href="/search/%E5%8C%85%E5%86%B2%E7%AA%81/1.htm">包冲突</a>
                                    <div>包冲突是开发过程中很常见的问题: 
其表现有: 
1.明明在eclipse中能够索引到某个类,运行时却报出找不到类。 
2.明明在eclipse中能够索引到某个类的方法,运行时却报出找不到方法。 
3.类及方法都有,以正确编译成了.class文件,在本机跑的好好的,发到测试或者正式环境就 
抛如下异常: 
 
java.lang.NoClassDefFoundError: Could not in</div>
                                </li>
                                <li><a href="/article/1654.htm"
                                       title="【Spark七十五】Spark Streaming整合Flume-NG三之接入log4j" target="_blank">【Spark七十五】Spark Streaming整合Flume-NG三之接入log4j</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/Stream/1.htm">Stream</a>
                                    <div>先来一段废话: 
实际工作中,业务系统的日志基本上是使用Log4j写入到日志文件中的,问题的关键之处在于业务日志的格式混乱,这给对日志文件中的日志进行统计分析带来了极大的困难,或者说,基本上无法进行分析,每个人写日志的习惯不同,导致日志行的格式五花八门,最后只能通过grep来查找特定的关键词缩小范围,但是在集群环境下,每个机器去grep一遍,分析一遍,这个效率如何可想之二,大好光阴都浪费在这上面了</div>
                                </li>
                                <li><a href="/article/1781.htm"
                                       title="sudoku solver in Haskell" target="_blank">sudoku solver in Haskell</a>
                                    <span class="text-muted">bookjovi</span>
<a class="tag" taget="_blank" href="/search/sudoku/1.htm">sudoku</a><a class="tag" taget="_blank" href="/search/haskell/1.htm">haskell</a>
                                    <div>这几天没太多的事做,想着用函数式语言来写点实用的程序,像fib和prime之类的就不想提了(就一行代码的事),写什么程序呢?在网上闲逛时发现sudoku游戏,sudoku十几年前就知道了,学生生涯时也想过用C/Java来实现个智能求解,但到最后往往没写成,主要是用C/Java写的话会很麻烦。 
  
现在写程序,本人总是有一种思维惯性,总是想把程序写的更紧凑,更精致,代码行数最少,所以现</div>
                                </li>
                                <li><a href="/article/1908.htm"
                                       title="java apache ftpClient" target="_blank">java apache ftpClient</a>
                                    <span class="text-muted">bro_feng</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>最近使用apache的ftpclient插件实现ftp下载,遇见几个问题,做如下总结。 
1. 上传阻塞,一连串的上传,其中一个就阻塞了,或是用storeFile上传时返回false。查了点资料,说是FTP有主动模式和被动模式。将传出模式修改为被动模式ftp.enterLocalPassiveMode();然后就好了。 
 
看了网上相关介绍,对主动模式和被动模式区别还是比较的模糊,不太了解被动模</div>
                                </li>
                                <li><a href="/article/2035.htm"
                                       title="读《研磨设计模式》-代码笔记-工厂方法模式" target="_blank">读《研磨设计模式》-代码笔记-工厂方法模式</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a>
                                    <div>声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/ 
 
 
 
 


package design.pattern;

/*
 * 工厂方法模式:使一个类的实例化延迟到子类
 * 某次,我在工作不知不觉中就用到了工厂方法模式(称为模板方法模式更恰当。2012-10-29):
 * 有很多不同的产品,它</div>
                                </li>
                                <li><a href="/article/2162.htm"
                                       title="面试记录语" target="_blank">面试记录语</a>
                                    <span class="text-muted">chenyu19891124</span>
<a class="tag" taget="_blank" href="/search/%E6%8B%9B%E8%81%98/1.htm">招聘</a>
                                    <div>或许真的在一个平台上成长成什么样,都必须靠自己去努力。有了好的平台让自己展示,就该好好努力。今天是自己单独一次去面试别人,感觉有点小紧张,说话有点打结。在面试完后写面试情况表,下笔真的好难,尤其是要对面试人的情况说明真的好难。 
今天面试的是自己同事的同事,现在的这个同事要离职了,介绍了我现在这位同事以前的同事来面试。今天这位求职者面试的是配置管理,期初看了简历觉得应该很适合做配置管理,但是今天面</div>
                                </li>
                                <li><a href="/article/2289.htm"
                                       title="Fire Workflow 1.0正式版终于发布了" target="_blank">Fire Workflow 1.0正式版终于发布了</a>
                                    <span class="text-muted">comsci</span>
<a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/workflow/1.htm">workflow</a><a class="tag" taget="_blank" href="/search/Google/1.htm">Google</a>
                                    <div>Fire Workflow 是国内另外一款开源工作流,作者是著名的非也同志,哈哈.... 
 官方网站是 http://www.fireflow.org 
 
 经过大家努力,Fire Workflow 1.0正式版终于发布了 
 
 正式版主要变化: 
1、增加IWorkItem.jumpToEx(...)方法,取消了当前环节和目标环节必须在同一条执行线的限制,使得自由流更加自由 
2、增加IT</div>
                                </li>
                                <li><a href="/article/2416.htm"
                                       title="Python向脚本传参" target="_blank">Python向脚本传参</a>
                                    <span class="text-muted">daizj</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E8%84%9A%E6%9C%AC/1.htm">脚本</a><a class="tag" taget="_blank" href="/search/%E4%BC%A0%E5%8F%82/1.htm">传参</a>
                                    <div>如果想对python脚本传参数,python中对应的argc, argv(c语言的命令行参数)是什么呢? 
需要模块:sys 
参数个数:len(sys.argv) 
脚本名:    sys.argv[0] 
参数1:     sys.argv[1] 
参数2:     sys.argv[</div>
                                </li>
                                <li><a href="/article/2543.htm"
                                       title="管理用户分组的命令gpasswd" target="_blank">管理用户分组的命令gpasswd</a>
                                    <span class="text-muted">dongwei_6688</span>
<a class="tag" taget="_blank" href="/search/passwd/1.htm">passwd</a>
                                    <div>NAME:  gpasswd - administer the /etc/group file 
SYNOPSIS: 
 gpasswd group 
 gpasswd -a user group 
 gpasswd -d user group 
 gpasswd -R group 
 gpasswd -r group 
 gpasswd [-A user,...] [-M user,...] g</div>
                                </li>
                                <li><a href="/article/2670.htm"
                                       title="郝斌老师数据结构课程笔记" target="_blank">郝斌老师数据结构课程笔记</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/1.htm">数据结构与算法</a>
                                    <div><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<</div>
                                </li>
                                <li><a href="/article/2797.htm"
                                       title="yii2 cgridview加上选择框进行操作" target="_blank">yii2 cgridview加上选择框进行操作</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/GridView/1.htm">GridView</a>
                                    <div>页面代码
<?=Html::beginForm(['controller/bulk'],'post');?>
<?=Html::dropDownList('action','',[''=>'Mark selected as: ','c'=>'Confirmed','nc'=>'No Confirmed'],['class'=>'dropdown',])</div>
                                </li>
                                <li><a href="/article/2924.htm"
                                       title="linux mysql" target="_blank">linux mysql</a>
                                    <span class="text-muted">fypop</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                                    <div>enquiry mysql version in centos linux 
yum list installed | grep mysql 
yum -y remove mysql-libs.x86_64 
enquiry mysql version in yum repositoryyum list | grep mysql oryum -y list mysql* 
install mysq</div>
                                </li>
                                <li><a href="/article/3051.htm"
                                       title="Scramble String" target="_blank">Scramble String</a>
                                    <span class="text-muted">hcx2013</span>
<a class="tag" taget="_blank" href="/search/String/1.htm">String</a>
                                    <div>Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrings recursively. 
Below is one possible representation of s1 = "great":</div>
                                </li>
                                <li><a href="/article/3178.htm"
                                       title="跟我学Shiro目录贴" target="_blank">跟我学Shiro目录贴</a>
                                    <span class="text-muted">jinnianshilongnian</span>
<a class="tag" taget="_blank" href="/search/%E8%B7%9F%E6%88%91%E5%AD%A6shiro/1.htm">跟我学shiro</a>
                                    <div>历经三个月左右时间,《跟我学Shiro》系列教程已经完结,暂时没有需要补充的内容,因此生成PDF版供大家下载。最近项目比较紧,没有时间解答一些疑问,暂时无法回复一些问题,很抱歉,不过可以加群(334194438/348194195)一起讨论问题。 
  
  
----广告-----------------------------------------------------</div>
                                </li>
                                <li><a href="/article/3305.htm"
                                       title="nginx日志切割并使用flume-ng收集日志" target="_blank">nginx日志切割并使用flume-ng收集日志</a>
                                    <span class="text-muted">liyonghui160com</span>

                                    <div>  
   nginx的日志文件没有rotate功能。如果你不处理,日志文件将变得越来越大,还好我们可以写一个nginx日志切割脚本来自动切割日志文件。第一步就是重命名日志文件,不用担心重命名后nginx找不到日志文件而丢失日志。在你未重新打开原名字的日志文件前,nginx还是会向你重命名的文件写日志,linux是靠文件描述符而不是文件名定位文件。第二步向nginx主</div>
                                </li>
                                <li><a href="/article/3432.htm"
                                       title="Oracle死锁解决方法" target="_blank">Oracle死锁解决方法</a>
                                    <span class="text-muted">pda158</span>
<a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a>
                                    <div> select p.spid,c.object_name,b.session_id,b.oracle_username,b.os_user_name from v$process p,v$session a, v$locked_object b,all_objects c where p.addr=a.paddr and a.process=b.process and c.object_id=b.</div>
                                </li>
                                <li><a href="/article/3559.htm"
                                       title="java之List排序" target="_blank">java之List排序</a>
                                    <span class="text-muted">shiguanghui</span>
<a class="tag" taget="_blank" href="/search/list%E6%8E%92%E5%BA%8F/1.htm">list排序</a>
                                    <div>   在Java Collection Framework中定义的List实现有Vector,ArrayList和LinkedList。这些集合提供了对对象组的索引访问。他们提供了元素的添加与删除支持。然而,它们并没有内置的元素排序支持。   你能够使用java.util.Collections类中的sort()方法对List元素进行排序。你既可以给方法传递</div>
                                </li>
                                <li><a href="/article/3686.htm"
                                       title="servlet单例多线程" target="_blank">servlet单例多线程</a>
                                    <span class="text-muted">utopialxw</span>
<a class="tag" taget="_blank" href="/search/%E5%8D%95%E4%BE%8B/1.htm">单例</a><a class="tag" taget="_blank" href="/search/%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">多线程</a><a class="tag" taget="_blank" href="/search/servlet/1.htm">servlet</a>
                                    <div>转自http://www.cnblogs.com/yjhrem/articles/3160864.html 
和   http://blog.chinaunix.net/uid-7374279-id-3687149.html 
Servlet 单例多线程 
Servlet如何处理多个请求访问?Servlet容器默认是采用单实例多线程的方式处理多个请求的:1.当web服务器启动的</div>
                                </li>
                </ul>
            </div>
        </div>
    </div>

<div>
    <div class="container">
        <div class="indexes">
            <strong>按字母分类:</strong>
            <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a
                href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a
                href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a
                href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a
                href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a
                href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a
                href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a
                href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a
                href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a>
        </div>
    </div>
</div>
<footer id="footer" class="mb30 mt30">
    <div class="container">
        <div class="footBglm">
            <a target="_blank" href="/">首页</a> -
            <a target="_blank" href="/custom/about.htm">关于我们</a> -
            <a target="_blank" href="/search/Java/1.htm">站内搜索</a> -
            <a target="_blank" href="/sitemap.txt">Sitemap</a> -
            <a target="_blank" href="/custom/delete.htm">侵权投诉</a>
        </div>
        <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.
<!--            <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>-->
        </div>
    </div>
</footer>
<!-- 代码高亮 -->
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script>
<link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/>
<script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script>





</body>

</html>