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/1880614004649422848.htm"
                           title="Next.js服务器操作:优势、局限与审慎应用" target="_blank">Next.js服务器操作:优势、局限与审慎应用</a>
                        <span class="text-muted">exploration-earth</span>
<a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/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>类似于任何技术,它们亦非尽善尽美,故而保持警觉至关重要。通过亲身经历中的挫折汲取了教训,现将之与诸位共勉。一大诟病在于潜在的紧密绑定问题。若服务器端代码嵌入组件之中,则可能导致代码库模块化程度削弱,维护成本攀升。后端逻辑的任何变动或许都将迫使前端相应更新,反之亦然。对于追求关注点严格分离的大型项目或团队而言,这无疑构成了严峻挑战。唯有秉持严谨的纪律与条理,方能避免代码库陷入混乱。再者,便是学习曲线</div>
                    </li>
                    <li><a href="/article/1880613370202222592.htm"
                           title="机器学习02-发展历史补充" target="_blank">机器学习02-发展历史补充</a>
                        <span class="text-muted">坐吃山猪</span>
<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%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>机器学习02-发展历史补充文章目录机器学习02-发展历史补充1-机器学习个人理解1-初始阶段:统计学习和模式识别(20世纪50年代至80年代)2-第二阶段【集成时代】+【核方法】(20世纪90年代至2000年代初期)3-第三阶段【特征工程】+【模型优化】(2000年代中期至2010年代初期)4-大规模数据和分布式计算(2010年代中后期)5-自动化机器学习和特征选择(2010年代末至今)2-神经网</div>
                    </li>
                    <li><a href="/article/1880613117008867328.htm"
                           title="2024-12-01百度TTS语音" target="_blank">2024-12-01百度TTS语音</a>
                        <span class="text-muted">坐吃山猪</span>
<a class="tag" taget="_blank" href="/search/AI%E8%AE%AD%E7%BB%83/1.htm">AI训练</a><a class="tag" taget="_blank" href="/search/AI%E7%BC%96%E7%A8%8B/1.htm">AI编程</a>
                        <div>百度TTS语音个人尝试代码仓库:https://gitee.com/enzoism/chrome_tampermonkey鸣谢:感谢每一位无私奉献的传道者,在此不一一具名!1-学习目标1)了解百度TTS语音2)使用百度TTS语音2-参考网址个人尝试代码仓库:https://gitee.com/enzoism/chrome_tampermonkey1-应用列表查看地址:https://console</div>
                    </li>
                    <li><a href="/article/1880606185065869312.htm"
                           title="OpenSPG docker 安装教程" target="_blank">OpenSPG docker 安装教程</a>
                        <span class="text-muted">@comefly</span>
<a class="tag" taget="_blank" href="/search/NLP/1.htm">NLP</a><a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/openspg/1.htm">openspg</a><a class="tag" taget="_blank" href="/search/%E7%9F%A5%E8%AF%86%E5%9B%BE%E8%B0%B1/1.htm">知识图谱</a><a class="tag" taget="_blank" href="/search/llm/1.htm">llm</a>
                        <div>文章目录前言自述一、OpenSPG1.介绍二、安装步骤1.安装服务端2.客户端部署前言自述我最近是想结合chatglm3-6b和知识图谱做一个垂直领域的技术规范的问答系统,过程中也遇到了很多困难,在模型微调上,在数据集收集整理上,在知识图谱的信息抽取上等等,咬咬牙,多学习就可以解决,本文主要写一下利用openspg做技术规范的信息抽取的部署安装过程。一、OpenSPG1.介绍OpenSPG是蚂蚁集</div>
                    </li>
                    <li><a href="/article/1880604295808741376.htm"
                           title="麒麟操作系统基础知识保姆级教程(十五)权限管理" target="_blank">麒麟操作系统基础知识保姆级教程(十五)权限管理</a>
                        <span class="text-muted">小屁不止是运维</span>
<a class="tag" taget="_blank" href="/search/%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/1.htm">基础知识</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/bash/1.htm">bash</a>
                        <div>如果你想拥有你从未拥有过的东西,那么你必须去做你从未做过的事情之前咱们了解过了麒麟操作系统的sudo提权,那么都有哪些关于咱们权限有哪些相关的知识呢?欢迎交流:在学习过程中如果你有任何疑问或想法,欢迎在评论区留言,我们可以共同探讨学习的内容。你的支持是我持续创作的动力!点赞、收藏与推荐:如果你觉得这篇文章对你有所帮助,请不要忘记点赞、收藏,并分享给更多的小伙伴!你们的鼓励是我不断进步的源泉!推广给</div>
                    </li>
                    <li><a href="/article/1880601009928073216.htm"
                           title="ChatGPT大模型极简应用开发-目录" target="_blank">ChatGPT大模型极简应用开发-目录</a>
                        <span class="text-muted">uncle_ll</span>
<a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/GPT/1.htm">GPT</a><a class="tag" taget="_blank" href="/search/chatgpt/1.htm">chatgpt</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/LLM/1.htm">LLM</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%A8%A1%E5%9E%8B/1.htm">大模型</a><a class="tag" taget="_blank" href="/search/GPT/1.htm">GPT</a>
                        <div>引言要理解ChatGPT,了解其背后的Transformer架构和GPT技术一路的演进则变得非常必要。ChatGPT背后的LLM技术使普通人能够通过自然语言完成过去只能由程序员通过编程语言实现的任务,这是一场巨大的变革。然而,人类通常容易高估技术的短期影响而低估长期影响。进一步学习关于LLM技术原理的论文、视频、图书等。在阅读这本书或者后续学习过程中,你有任何疑问都可以随时请教ChatGPT等工具</div>
                    </li>
                    <li><a href="/article/1880597101025488896.htm"
                           title="Python数据分析高频面试题及答案" target="_blank">Python数据分析高频面试题及答案</a>
                        <span class="text-muted">闲人编程</span>
<a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98%E9%9D%A2%E8%AF%95/1.htm">程序员面试</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95%E9%A2%98/1.htm">面试题</a><a class="tag" taget="_blank" href="/search/%E6%A0%B8%E5%BF%83/1.htm">核心</a>
                        <div>目录1.基础知识2.数据处理3.数据可视化4.机器学习模型5.进阶问题6.数据清洗与预处理7.数据转换与操作8.时间序列分析9.高级数据分析技术10.数据降维与特征选择11.模型评估与优化12.数据操作与转换13.数据筛选与分析14.数据可视化与报告15.数据统计与分析16.高级数据处理以下是一些Python数据分析的高频核心面试题及其答案,涵盖了基础知识、数据1.基础知识问1:Python中列表</div>
                    </li>
                    <li><a href="/article/1880593559082561536.htm"
                           title="Thanos架构学习" target="_blank">Thanos架构学习</a>
                        <span class="text-muted">qq_道可道</span>
<a class="tag" taget="_blank" href="/search/%E7%9B%91%E6%8E%A7/1.htm">监控</a><a class="tag" taget="_blank" href="/search/K8S%E4%B8%8E%E5%AE%B9%E5%99%A8/1.htm">K8S与容器</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a>
                        <div>Thanos架构学习简介Thanos有两种架构模式sidecar部署receiver部署组件概念及说明简介官网参考Thanos基于prometheus,在此基础上提供了全局指标查询,可将多个云/region的prometheus数据集中管理,并且将数据直接存储到廉价的对象存储,可以存放更久的数据(并对历史数据进行压缩与降采样),降低本地prometheus存储费用,同时可与现有的prometheu</div>
                    </li>
                    <li><a href="/article/1880586612786655232.htm"
                           title="Pytorch 三小时极限入门教程" target="_blank">Pytorch 三小时极限入门教程</a>
                        <span class="text-muted">power-辰南</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%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a><a class="tag" taget="_blank" href="/search/pytorch/1.htm">pytorch</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a>
                        <div>一、引言在当今的人工智能领域,深度学习占据了举足轻重的地位。而Pytorch作为一款广受欢迎的深度学习框架,以其简洁、灵活的特性,吸引了大量开发者投身其中。无论是科研人员探索前沿的神经网络架构,还是工程师将深度学习技术落地到实际项目,Pytorch都提供了强大的支持。本教程将带你从零基础开始,一步步深入了解Pytorch的核心知识,助你顺利踏上深度学习的征程。二、Pytorch基础环境搭建安装An</div>
                    </li>
                    <li><a href="/article/1880582699966590976.htm"
                           title="Python机器学习之XGBoost从入门到实战(基本理论说明)" target="_blank">Python机器学习之XGBoost从入门到实战(基本理论说明)</a>
                        <span class="text-muted">雪域枫蓝</span>
<a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/Atificial/1.htm">Atificial</a><a class="tag" taget="_blank" href="/search/Intelligence/1.htm">Intelligence</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/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a>
                        <div>Xgboost从基础到实战XGBoost:eXtremeGradientBoosting*应用机器学习领域的一个强有力的工具*GradientBootingMachines(GBM)的优化表现,快速有效—深盟分布式机器学习开源平台(DistributedmachinelearningCommunity,DMLC)的分支—DMLC也开源流行的深度学习库mxnet*GBM:Machine:机器学习模型</div>
                    </li>
                    <li><a href="/article/1880580807102361600.htm"
                           title="手把手教你使用 Python 制作贪吃蛇游戏|Python游戏" target="_blank">手把手教你使用 Python 制作贪吃蛇游戏|Python游戏</a>
                        <span class="text-muted">程序员CC_</span>
<a class="tag" taget="_blank" href="/search/Python%E6%95%99%E7%A8%8B/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%A6python/1.htm">学python</a><a class="tag" taget="_blank" href="/search/pygame/1.htm">pygame</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>贪吃蛇游戏是有史以来最受欢迎的街机游戏之一。在这个游戏中,玩家的主要目标是在不撞墙或不撞墙的情况下抓住最大数量的水果。在学习Python或Pygame时,可以将创建蛇游戏视为一项挑战。这是每个新手程序员都应该接受的最好的初学者友好项目之一。学习构建视频游戏是一种有趣而有趣的学习。我们将使用Pygame来创建这个蛇游戏。Pygame是一个开源库,专为制作视频游戏而设计。它具有内置的图形和声音库。它也</div>
                    </li>
                    <li><a href="/article/1880580303190290432.htm"
                           title="midjourney初学者必看(迅速入门)" target="_blank">midjourney初学者必看(迅速入门)</a>
                        <span class="text-muted">会飞the羊</span>
<a class="tag" taget="_blank" href="/search/midjourney/1.htm">midjourney</a>
                        <div>Midjourney初步学习:基本操作流程:-新建一个服务器-在输入框里添加MJROBOT:https://discord.com/oauth2/authorize?client_id=936929561302675456&permissions=2147601472&scope=applications.commands%20bot-输入/→选择imagine开始写prompt-prompt使用</div>
                    </li>
                    <li><a href="/article/1880576647602696192.htm"
                           title="【数据分析岗】关于数据分析岗面试python的金典问题+解答,包含数据读取、数据清洗、数据分析、机器学习等内容" target="_blank">【数据分析岗】关于数据分析岗面试python的金典问题+解答,包含数据读取、数据清洗、数据分析、机器学习等内容</a>
                        <span class="text-muted">摇光~</span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                        <div>大家好,我是摇光~,用大白话讲解所有你难懂的知识点最近和几个大佬交流了,说了很多关于现在职场面试等问题,然后也找他们问了问他们基本面试的话都会提什么问题。所以我收集了很多关于python的面试题,希望对大家面试有用。类别1:数据读取与处理问题1:如何用Python从Excel文件中读取数据?答:在Python中,可以使用pandas库从Excel文件中读取数据。pandas提供了read_exce</div>
                    </li>
                    <li><a href="/article/1880574629773373440.htm"
                           title="【Python篇】深入机器学习核心:XGBoost 从入门到实战" target="_blank">【Python篇】深入机器学习核心:XGBoost 从入门到实战</a>
                        <span class="text-muted">半截诗</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><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><a class="tag" taget="_blank" href="/search/%E5%88%86%E7%B1%BB/1.htm">分类</a><a class="tag" taget="_blank" href="/search/%E5%9B%9E%E5%BD%92/1.htm">回归</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a><a class="tag" taget="_blank" href="/search/XGBoost/1.htm">XGBoost</a>
                        <div>文章目录XGBoost完整学习指南:从零开始掌握梯度提升1.前言2.什么是XGBoost?2.1梯度提升简介3.安装XGBoost4.数据准备4.1加载数据4.2数据集划分5.XGBoost基础操作5.1转换为DMatrix格式5.2设置参数5.3模型训练5.4预测6.模型评估7.超参数调优7.1常用超参数7.2网格搜索8.XGBoost特征重要性分析9.高级功能扩展9.1模型解释与可解释性9.2</div>
                    </li>
                    <li><a href="/article/1880573495792955392.htm"
                           title="【YOLOv8杂草作物目标检测】" target="_blank">【YOLOv8杂草作物目标检测】</a>
                        <span class="text-muted">stsdddd</span>
<a class="tag" taget="_blank" href="/search/YOLO%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B/1.htm">YOLO目标检测</a><a class="tag" taget="_blank" href="/search/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B/1.htm">目标检测</a><a class="tag" taget="_blank" href="/search/YOLO/1.htm">YOLO</a><a class="tag" taget="_blank" href="/search/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B/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>YOLOv8杂草目标检测算法介绍模型和数据集下载算法介绍YOLOv8在禾本科杂草目标检测方面有显著的应用和效果。以下是一些关键信息的总结:农作物幼苗与杂草检测系统:基于YOLOv8深度学习框架,通过2822张图片训练了一个目标检测模型,用于检测田间的农作物幼苗与杂草对象。该系统支持图片、视频以及摄像头进行目标检测,并能保存检测结果。系统界面可实时显示目标位置、目标总数、置信度、用时等信息。YOLO</div>
                    </li>
                    <li><a href="/article/1880568954334801920.htm"
                           title="JavaWeb原生框架开发JSP+Servlet+JDBC案例" target="_blank">JavaWeb原生框架开发JSP+Servlet+JDBC案例</a>
                        <span class="text-muted">秦老师Q</span>
<a class="tag" taget="_blank" href="/search/JavaWeb%E5%9F%BA%E7%A1%80/1.htm">JavaWeb基础</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/servlet/1.htm">servlet</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.项目列表2.网页3.Servlet小结概要JavaWeb开发案例,使用JSP、Servlet、JDBC原生框架技术,实现用户模块的功能开发,主要用于学习。功能1.注册2.登录3.用户模块3.1查询用户信息3.2删除用户信息3.3修改用户信息技术名词解释JSP:全称JavaServerPages,是由Sun公司主导创建的一种动态网页技术标准,JSP中可以编写Jav</div>
                    </li>
                    <li><a href="/article/1880568955865722880.htm"
                           title="EL表达式与JSTL标签库详解" target="_blank">EL表达式与JSTL标签库详解</a>
                        <span class="text-muted">秦老师Q</span>
<a class="tag" taget="_blank" href="/search/JavaWeb%E5%9F%BA%E7%A1%80/1.htm">JavaWeb基础</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>前言本章主要学习EL表达式与JSTL标签库,用于简化JSP数据操作。收录JavaWeb基础系列,该系列主要学习JavaWeb开发原生框架、Servlet、JSP、request请求对象、response响应对象、Session会话对象、Filter过滤器、EL表达式、JSTL标签库、三层开发模型等知识点,欢迎童鞋们互相交流。觉得不错可以三连订阅喔。目标一、EL表达式1.概念2.语法3.示例4.EL</div>
                    </li>
                    <li><a href="/article/1880568450410147840.htm"
                           title="MySQL第一章 dos窗口mysql命令合集(超详细!!!)一篇就够了" target="_blank">MySQL第一章 dos窗口mysql命令合集(超详细!!!)一篇就够了</a>
                        <span class="text-muted">秦老师Q</span>
<a class="tag" taget="_blank" href="/search/MySQL%E6%95%B0%E6%8D%AE%E5%BA%93%E5%9F%BA%E7%A1%80/1.htm">MySQL数据库基础</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/adb/1.htm">adb</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/database/1.htm">database</a>
                        <div>前言:本章节主要学习MySQL数据库在dos窗口下的基础命令,sql语句等相关知识点,收录于MySQL基础系列,该系列主要讲解MySQL数据库dos命令/sql约束/sql语句/sql连接查询等相关知识点,欢迎童鞋们互相交流。觉得不错可以三连订阅喔。目标:1连接Mysql1.1连接本机上的MYSQL1.2连接远程主机上的MYSQL1.3退出MYSQL命令2修改密码2.1给root加个密码ab122</div>
                    </li>
                    <li><a href="/article/1880563819395215360.htm"
                           title="盘点ECMAScript 2024的新提案" target="_blank">盘点ECMAScript 2024的新提案</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a>
                        <div>前面我们了解了ECMAScript2024(ES15)的5个新特性,现在我们继续学习一下其他令人耳目一新的提案吧。1.模式匹配(初期阶段)JavaScript变得更智能了,有了模式匹配!想象它就像一个超强大的switch语句,可以处理复杂的数据结构。ES15允许你简单地匹配模式,而不是编写一堆嵌套的条件语句来检查对象的形状。️旧方式functioncheckAnimal(animal){if(an</div>
                    </li>
                    <li><a href="/article/1880563026147471360.htm"
                           title="mac运行第一个java_Mac下第一个java-servelet程序" target="_blank">mac运行第一个java_Mac下第一个java-servelet程序</a>
                        <span class="text-muted">老纪聊数码</span>
<a class="tag" taget="_blank" href="/search/mac%E8%BF%90%E8%A1%8C%E7%AC%AC%E4%B8%80%E4%B8%AAjava/1.htm">mac运行第一个java</a>
                        <div>可学习到:设置环境变量方便运行命令和编译程序。servlet-api.jar中包括了servlet相关的api和类tomcat是servlet的容器,没有容器程序跑不起来。tomcat下载地址:http://tomcat.apache.org/我下载的是:apache-tomcat-7.0.67.tar.gz解压开之后放到usr/local目录中tomcat目录启动/usr/local/apach</div>
                    </li>
                    <li><a href="/article/1880562773490987008.htm"
                           title="Python学习day14 BBS功能和聊天室" target="_blank">Python学习day14 BBS功能和聊天室</a>
                        <span class="text-muted">weixin_30725467</span>
<a class="tag" taget="_blank" href="/search/json/1.htm">json</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/ViewUI/1.htm">ViewUI</a>
                        <div>Createdon2017年5月15日@author:louts第1课作业讲解及装饰器使用28minutesdefcheck(func):defrec(request,*args,**kargs):returnfunc(request,*args,**kargs)returnrec@checkdefindex(request,):printrequest第2课自定义装饰器扩展使用18minutes</div>
                    </li>
                    <li><a href="/article/1880559995234349056.htm"
                           title="【论文翻译】GOT-OCR论文翻译——General OCR Theory: Towards OCR-2.0 via a Unified End-to-end Model" target="_blank">【论文翻译】GOT-OCR论文翻译——General OCR Theory: Towards OCR-2.0 via a Unified End-to-end Model</a>
                        <span class="text-muted">机器白学</span>
<a class="tag" taget="_blank" href="/search/%E8%AE%BA%E6%96%87%E7%BF%BB%E8%AF%91/1.htm">论文翻译</a><a class="tag" taget="_blank" href="/search/ocr/1.htm">ocr</a><a class="tag" taget="_blank" href="/search/%E8%AE%BA%E6%96%87%E9%98%85%E8%AF%BB/1.htm">论文阅读</a><a class="tag" taget="_blank" href="/search/%E8%AE%BA%E6%96%87%E7%BF%BB%E8%AF%91/1.htm">论文翻译</a>
                        <div>论文原文链接:https://arxiv.org/abs/2409.01704特别声明,本文不做任何商业用途,仅作为个人学习相关论文的翻译记录。本文对原文内容直译,一切以论文原文内容为准,对原文作者表示最大的敬意。如有任何侵权请联系我下架相关文章。目录通用OCR理论:通过统一的端到端模型迈向OCR-2.00摘要1引言2相关工作2.1传统OCR2.2基于LVLM的OCR3通用OCR理论3.1框架3.</div>
                    </li>
                    <li><a href="/article/1880559996723326976.htm"
                           title="深度学习(1)" target="_blank">深度学习(1)</a>
                        <span class="text-muted">浅忆へ梦微凉</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/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/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/%E5%AD%A6%E4%B9%A0%E6%96%B9%E6%B3%95/1.htm">学习方法</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                        <div>一、torch的安装基于直接设备情况,选择合适的torch版本,有显卡的建议安装GPU版本,可以通过nvidia-smi命令来查看显卡驱动的版本,在官网中根据cuda版本,选择合适的版本号,下面是安装示例代码GPU:pipinstalltorch==2.5.0torchvision==0.20.0torchaudio==2.5.0--index-urlhttps://download.pytorc</div>
                    </li>
                    <li><a href="/article/1880558770195591168.htm"
                           title="提升数据科学工作流效率的10个Jupyter Notebook高级特性" target="_blank">提升数据科学工作流效率的10个Jupyter Notebook高级特性</a>
                        <span class="text-muted"></span>

                        <div>JupyterNotebooks已成为数据科学家、机器学习工程师和Python开发人员的核心开发工具。其核心优势在于提供了一个集成式环境,支持代码执行、文本编辑和数据可视化的无缝整合。尽管大多数用户熟悉其基本功能,但许多能显著提升工作效率的高级特性往往被忽视。本文将介绍一些高级功能,帮助您在数据科学项目中充分发挥JupyterNotebooks的潜力。1、Magic命令:高效的命令行接口Jupyt</div>
                    </li>
                    <li><a href="/article/1880557978269052928.htm"
                           title="Python 数据建模完整流程指南" target="_blank">Python 数据建模完整流程指南</a>
                        <span class="text-muted">木觞清</span>
<a class="tag" taget="_blank" href="/search/3%E5%A4%A9%E5%85%A5%E9%97%A8Python/1.htm">3天入门Python</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>在数据科学和机器学习中,建模是一个至关重要的过程。通过有效的数据建模,我们能够从原始数据中提取有用的洞察,并为预测或分类任务提供支持。在本篇博客中,我们将通过Python展示数据建模的完整流程,包括数据准备、建模、评估和优化等步骤。1.导入必要的库在进行任何数据分析或建模之前,首先需要导入必需的Python库。这些库提供了各种工具和算法,帮助我们更高效地完成任务。importnumpyasnpim</div>
                    </li>
                    <li><a href="/article/1880556211326218240.htm"
                           title="文心一言 vs gpt-4 全面横向比较" target="_blank">文心一言 vs gpt-4 全面横向比较</a>
                        <span class="text-muted">周盛欢</span>
<a class="tag" taget="_blank" href="/search/%E6%96%87%E5%BF%83%E4%B8%80%E8%A8%80/1.htm">文心一言</a>
                        <div>文心一言是中国百度公司研发的大规模语言模型,它有超多的参数,就像一个超级大脑,特别擅长理解并生成中文内容。在聊天啊、写文章啊、答题这些任务上表现不错,对中国文化和国情有更深的理解和适应能力。GPT-3.5是OpenAI公司的上一代大模型,比GPT-3更智能一些。而GPT-4作为其升级版,大家预计它会有更大的模型参数量,更强的学习和推理能力,可能会在各种语言任务上实现更大突破。所以,如果拿文心一言跟</div>
                    </li>
                    <li><a href="/article/1880555453751029760.htm"
                           title="深度学习常用格式转化脚本xml2yolo/coco2yolo/bdd2yolo/frame2video等" target="_blank">深度学习常用格式转化脚本xml2yolo/coco2yolo/bdd2yolo/frame2video等</a>
                        <span class="text-muted">qq1309399183</span>
<a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AE%9E%E6%88%98%E9%A1%B9%E7%9B%AE%E9%9B%86%E5%90%88/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/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E6%A0%BC%E5%BC%8F%E8%BD%AC%E5%8C%96%E8%84%9A%E6%9C%AC/1.htm">格式转化脚本</a><a class="tag" taget="_blank" href="/search/voc2yolo%E6%A0%BC%E5%BC%8F%E8%BD%AC%E5%8C%96/1.htm">voc2yolo格式转化</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E9%9B%86%E6%A0%BC%E5%BC%8F%E8%BD%AC%E6%8D%A2/1.htm">数据集格式转换</a><a class="tag" taget="_blank" href="/search/xml2yolo/1.htm">xml2yolo</a><a class="tag" taget="_blank" href="/search/coco2yolo/1.htm">coco2yolo</a>
                        <div>文章目录1.**数据集格式转换脚本**`coco2yolo.py`示例注释:注释说明:`xml2yolo.py`示例注释:注释说明:2.**数据集可视化与统计**`vis_yolo_files.py`示例注释:注释说明:3.**其他工具脚本**`frames2video.py`示例注释:注释说明:该项目提供了一系列用于深度学习的数据处理工具,主要功能包括:数据集格式转换:提供多种脚本,将不同格式的</div>
                    </li>
                    <li><a href="/article/1880554441317347328.htm"
                           title="LLMs,即大型语言模型" target="_blank">LLMs,即大型语言模型</a>
                        <span class="text-muted">maopig</span>
<a class="tag" taget="_blank" href="/search/AI/1.htm">AI</a><a class="tag" taget="_blank" href="/search/%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B/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/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86/1.htm">自然语言处理</a>
                        <div>LLMs,即大型语言模型,是一类基于深度学习的人工智能模型,它们通过海量的数据和大量的计算资源进行训练,可以理解和生成自然语言。LLMs的核心架构是Transformer,其关键在于自注意力机制,使得模型能够同时对输入的所有位置进行“关注”,从而更好地捕捉长距离的语义依赖关系。LLMs在众多领域都有广泛的应用,如自然语言理解(NLU),语言生成,以及语音识别和合成等。例如,它们能够理解人类的语言</div>
                    </li>
                    <li><a href="/article/1880554189189345280.htm"
                           title="随机森林分类算法原理与实验分析" target="_blank">随机森林分类算法原理与实验分析</a>
                        <span class="text-muted">ningaiiii</span>
<a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E4%B8%8E%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">机器学习与深度学习</a><a class="tag" taget="_blank" href="/search/%E9%9A%8F%E6%9C%BA%E6%A3%AE%E6%9E%97/1.htm">随机森林</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E7%B1%BB/1.htm">分类</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a>
                        <div>随机森林分类算法原理与实验分析1.引言随机森林(RandomForest)是一种集成学习方法,它通过构建多个决策树并结合它们的预测结果来进行分类。你可以把它想象成一个“团队决策”的过程:团队中的每个成员(决策树)都独立发表意见,最后通过投票决定最终结果。这种方法不仅提高了模型的准确性,还增强了模型的稳定性和鲁棒性。随机森林的主要特点是通过随机选择样本和特征来构建多个决策树,从而避免单棵决策树可能产</div>
                    </li>
                    <li><a href="/article/1880548267469631488.htm"
                           title="【LLM】大语言模型(LLMs)" target="_blank">【LLM】大语言模型(LLMs)</a>
                        <span class="text-muted">林九生</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/%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B/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/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86/1.htm">自然语言处理</a>
                        <div>大型语言模型(LLMs)1.什么是大型语言模型?大型语言模型(LargeLanguageModel,LLM)是基于深度学习的自然语言处理模型,能够理解和生成自然语言文本。它们通过在大规模文本数据上进行训练,学习语言的语法、语义和各种语言特征,从而可以执行诸如文本生成、翻译、总结、问答等多种语言任务。以下是大型语言模型的定义和基本原理:1.1定义大型语言模型是由大量参数组成的神经网络,这些参数通过在</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>