qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問(wèn) http://qaseven.github.io/

          Selenium 2.0 WebDriver 使用指南

            SeleniumWebDriver
            注意:我們正致力于完善幫助指南的每一個(gè)章節(jié),雖然這個(gè)章節(jié)仍然存在需要完善的地方,不過(guò)我們堅(jiān)信當(dāng)前你看到的幫助信息是精確無(wú)誤的,后續(xù)我們會(huì)提供更多的指導(dǎo)信息來(lái)完善幫助文檔。
            1.WebDriver介紹
            Selenium2.0最主要的新特性就是集成了WebDriverAPI。我們?cè)O(shè)計(jì)WebDriver的初衷是提供更加簡(jiǎn)單明了的接口來(lái)彌補(bǔ)Selenium-RCAPI的不足。在動(dòng)態(tài)網(wǎng)頁(yè)中,通常只會(huì)更新局部的html元素,WebDriver會(huì)很好的幫助用戶快速定位這些元素。我們最終的目的是通過(guò)提供精心設(shè)計(jì)的面向?qū)ο驛PI來(lái)解決現(xiàn)代高級(jí)網(wǎng)頁(yè)中的測(cè)試難題。
            2.WebDriver如何驅(qū)動(dòng)瀏覽器?與Selenium-RC有什么區(qū)別?
            不同類型的瀏覽器都會(huì)有原生的接口支持自動(dòng)化操作,Selenium通過(guò)這些接口直接向?yàn)g覽器發(fā)送指令。如何發(fā)送這些指令取決于你當(dāng)前使用的瀏覽器類型,我們將在這一章節(jié)后面來(lái)詳細(xì)介紹。
            看上去WebDriver與之前Selenium-RC的實(shí)現(xiàn)方式類似,實(shí)際上兩者之間存在著本質(zhì)的區(qū)別。對(duì)于所有類型的瀏覽器Selenium-RC都是使用的同一種方法:當(dāng)瀏覽器啟動(dòng)時(shí),向其中注入javascript,從而使用這些js來(lái)驅(qū)動(dòng)瀏覽器中的AUT(ApplicationUnderTest)。WebDriver并沒(méi)有使用這種技術(shù),它是通過(guò)調(diào)用瀏覽器原生的自動(dòng)化API直接驅(qū)動(dòng)瀏覽器。
            3.WebDriver與SeleniumServer
            是否需要是用SeleniumServer取決于你使用WebDriver的方式。以下兩種情況不需要使用SeleniumServer,WebDriver直接運(yùn)行瀏覽器即可:1、testcases僅僅使用了Webdriver的API;2、瀏覽器和testcase在同一臺(tái)PC上,而且testcases僅僅使用了Webdriver的API。
            以下三種情況你需要結(jié)合SeleniumServer來(lái)使用WebDriver:
            1)使用Selenium-Grid管理集群環(huán)境(或者虛擬機(jī))上的testcase;
            2)需要調(diào)用非本機(jī)上的不同版本的瀏覽器;
            3)未使用任何languagebinding(java/c#/python/ruby),且有意向使用HtmlUnitDriver。
            4.配置Selenium-WebDriver工程
            安裝Selenium是指在開(kāi)發(fā)環(huán)境上配置一個(gè)工程,然后可以在這個(gè)工程中用Selenium編寫程序。如何配置取決于你使用的開(kāi)發(fā)語(yǔ)言和編程環(huán)境。
            使用Maven是配置一個(gè)Selenium2.0java工程最簡(jiǎn)單的方式。Maven會(huì)下載所有javabingdings以及所有相關(guān)的庫(kù)(theSelenium2.0javaclientlibrary)。通過(guò)使用pom.xml(maven配置文件)來(lái)新建工程,你可以根據(jù)自己的喜好將Maven工程導(dǎo)入IntelliJIDEA或者Eclipse。
            首先,創(chuàng)建一個(gè)文件夾存放Maven工程文件。然后,創(chuàng)建pom.xml,你可以使用texteditor來(lái)編輯。鑒于已經(jīng)有很多關(guān)于“如何在Maven工程中使用pom.xml”優(yōu)秀的參考文獻(xiàn),這里將不再過(guò)多的討論相關(guān)細(xì)節(jié)。下面給出一個(gè)示例,為你的工程也創(chuàng)建一個(gè)類似的文件。
          <?xmlversion="1.0"encoding="UTF-8"?>
          <projectxmlns="http://maven.apache.org/POM/4.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
          <groupId>MySel20Proj</groupId>
          <artifactId>MySel20Proj</artifactId>
          <version>1.0</version>
          <dependencies>
          <dependency>
          <groupId>org.seleniumhq.selenium</groupId>
          <artifactId>selenium-java</artifactId>
          <version>2.38.0</version>
          </dependency>
          <dependency>
          <groupId>com.opera</groupId>
          <artifactId>operadriver</artifactId>
          </dependency>
          </dependencies>
          <dependencyManagement>
          <dependencies>
          <dependency>
          <groupId>com.opera</groupId>
          <artifactId>operadriver</artifactId>
          <version>1.5</version>
          <exclusions>
          <exclusion>
          <groupId>org.seleniumhq.selenium</groupId>
          <artifactId>selenium-remote-driver</artifactId>
          </exclusion>
          </exclusions>
          </dependency>
          </dependencies>
          </dependencyManagement>
          </project>
          請(qǐng)確認(rèn)你使用的WebDriver是最新的當(dāng)前版本。在這篇文檔撰寫時(shí),上述示例給出的是最新的版本。在Selenium2.0發(fā)布不久WebDriver就有過(guò)頻繁的更新。請(qǐng)?jiān)谶@個(gè)鏈接MavenDownloadPage確認(rèn)當(dāng)前的版本,相應(yīng)地修改你工程中的pon.xml。
            現(xiàn)在,你可以通過(guò)dos界面使用CD命令進(jìn)入工程所在文件夾,通過(guò)以下命令運(yùn)行Maven。
            mvncleaninstall
            運(yùn)行之后會(huì)自動(dòng)下載Selenium及相關(guān)套件,并加載到你的工程中去。
            最后,將你的工程導(dǎo)入到你偏好的IDE中。如果你對(duì)導(dǎo)入的過(guò)程不是很清楚,我們已經(jīng)準(zhǔn)備了操作指南。
            ImportingamavenprojectintoIntelliJIDEA.ImportingamavenprojectintoEclipse
            5.如何將自動(dòng)化工程從Selenium1.0遷移到Selenium2.0
            已經(jīng)在Selenium1.0上構(gòu)建測(cè)試工程的用戶,我們?yōu)槟峁┝艘环葜笇?dǎo)如何將已有的代碼遷移到Selenium2.0。Selenium2.0的首席開(kāi)發(fā)工程師SimonStewart為此撰寫了一片文章:MagratingFromSeleniumRCtoSeleniumWebDriver。
            6.Selenium-WebDriverAPI簡(jiǎn)介
            WebDriver可以用來(lái)實(shí)現(xiàn)Web應(yīng)用程序的自動(dòng)化測(cè)試,特別適合于驗(yàn)證實(shí)際結(jié)果是否符合預(yù)期結(jié)果的場(chǎng)景。WebDriver旨在提供比Selenium1.0更加易用、友好的API,便于用戶的探索和理解,從而使測(cè)試用例變得容易閱讀和維護(hù)。WebDriver沒(méi)有使用任何第三方測(cè)試框架,所以它可以很好與單元測(cè)試工具或者最古老的main函數(shù)結(jié)合使用。本章節(jié)將介紹如何使用WebDriver的API,幫助你慢慢開(kāi)始了解WebDriver。如果你還沒(méi)有新建一個(gè)Selenium工程,請(qǐng)先完成這個(gè)操作,在這個(gè)章節(jié)的上面有詳細(xì)的描述。
            當(dāng)你創(chuàng)建完Selenium工程后,你會(huì)發(fā)現(xiàn)WebDriver和普通的第三方庫(kù)一樣是完全獨(dú)立的,在你使用之前不需要啟動(dòng)任何額外的進(jìn)程或者安裝程序,相反如果你使用Selenium-RC需要先啟動(dòng)代理服務(wù)器。
            注意:當(dāng)你使用如下WebDriver時(shí)需要額外的步驟:ChromeDriver,OperaDriver,AndroidDriver,IPhoneDriver。
            現(xiàn)在你肯定躍躍欲試要寫一些代碼了。我們以一個(gè)簡(jiǎn)單的例子來(lái)開(kāi)始第一段旅程:在Google上搜索“Cheese”,并打印出搜索結(jié)果網(wǎng)頁(yè)的標(biāo)題。
          packageorg.openqa.selenium.example;
          importorg.openqa.selenium.By;
          importorg.openqa.selenium.WebDriver;
          importorg.openqa.selenium.WebElement;
          importorg.openqa.selenium.firefox.FirefoxDriver;
          importorg.openqa.selenium.support.ui.ExpectedCondition;
          importorg.openqa.selenium.support.ui.WebDriverWait;
          publicclassSelenium2Example{
          publicstaticvoidmain(String[]args){
          //創(chuàng)建一個(gè)FirefoxDriver實(shí)例
          //這個(gè)類依賴于接口而不是接口的實(shí)現(xiàn)
          WebDriverdriver=newFirefoxDriver();
          //使用get方法訪問(wèn)Google
          driver.get("http://www.google.com");
          //使用下面這個(gè)方法也能夠達(dá)到訪問(wèn)Google的目的
          //driver.navigate().to("http://www.google.com");
          //找到html輸入框的name
          WebElementelement=driver.findElement(By.name("q"));
          //輸入要查找的內(nèi)容
          element.sendKeys("Cheese!");
          //提交表單,WebDriver會(huì)自動(dòng)找到我們需要提交的元素所在的表單
          element.submit();
          //打印網(wǎng)頁(yè)的標(biāo)題
          System.out.println("Pagetitleis:"+driver.getTitle());
          //Google的搜索網(wǎng)頁(yè)會(huì)通過(guò)JS動(dòng)態(tài)渲染
          //等待頁(yè)面加載完畢,超時(shí)時(shí)間為10秒
          (newWebDriverWait(driver,10)).until(newExpectedCondition<Boolean>(){
          publicBooleanapply(WebDriverd){
          returnd.getTitle().toLowerCase().startsWith("cheese!");
          }
          });
          //控制臺(tái)上將打印如下信息:"cheese!-GoogleSearch"
          System.out.println("Pagetitleis:"+driver.getTitle());
          //關(guān)閉瀏覽器
          driver.quit();
          }
          }
            在本章節(jié)的接下來(lái)篇幅,我們將學(xué)習(xí)如何使用WebDriver操作你的瀏覽器,如何使用框架和窗口來(lái)測(cè)試Web網(wǎng)站。當(dāng)然,我們將提供更加翔實(shí)的論述和舉例。
            7.Selenium-WebDriverAPI詳解
            7.1獲取Web頁(yè)面
            我們第一件要做的事是通過(guò)WebDriver取得Web頁(yè)面的控制權(quán),一般情況下使用get方法
            driver.get("http://www.google.com");
            在某些情況下,比如操作系統(tǒng)和瀏覽器的穿插組合,WebDriver有可能不會(huì)等待Web頁(yè)面加載完成,這種情況下WebDriver會(huì)返回錯(cuò)誤或者直接運(yùn)行下一步操作。為了保證程序的健壯性,你需要等待頁(yè)面中某個(gè)元素加載完成后再進(jìn)行下一步操作,請(qǐng)參考ExplicitandImplicitWaits。
            7.2定位UI元素
            我們可以通過(guò)WebDriver實(shí)例或者WebElement類來(lái)定位UI元素。我們?yōu)槊糠N編程語(yǔ)言都提供了兩種方法:“FindElement”和“FindElements”。第一種方法返回的一個(gè)WebElement,找不到則拋出異常。第二個(gè)方法返回一個(gè)WebElement鏈表(List),在找不到任何DOM元素的情況下會(huì)返回空的鏈表。
            Find方法會(huì)使用類似探測(cè)器的類,類名叫做By。下面列舉By的一些常用方法:
            ByID
            當(dāng)我們定位一個(gè)UI元素,這個(gè)是最有效也是最好的方法。不過(guò)這個(gè)方法不是萬(wàn)能的,有的前端開(kāi)發(fā)在設(shè)計(jì)UI元素時(shí)會(huì)遺漏ID或者使用動(dòng)態(tài)ID,這兩種情況下都要避免使用這個(gè)方法。這時(shí)候使用獲取class名稱方法比ByID更合適。
            示例:如何使用該方法定位元素
            <divid="coolestWidgetEvah">...</div>
            WebElementelement=driver.findElement(By.id("coolestWidgetEvah"));
          ByClassName
            在這種場(chǎng)景下,我們引用DOM元素的屬性。實(shí)際情況是很多元素都有一樣的ClassName,因此找到多個(gè)有相同ClassName的元素,比找到第一個(gè)擁有這個(gè)ClassName的元素來(lái)的更重要。
            示例:如何使用該方法定位元素
            <divclass="cheese"><span>Cheddar</span></div><divclass="cheese"><span>Gouda</span></div>
            List<WebElement>cheeses=driver.findElements(By.className("cheese"));
            ByTagName
            DOM元素Tag的名稱。
            示例:如何使用該方法定位元素
            <iframesrc="..."></iframe>
            WebElementframe=driver.findElement(By.tagName("iframe"));
            ByName
            找到與Name屬性相同的Input元素。
            示例:如何使用該方法定位元素
            <inputname="cheese"type="text"/>
            WebElementcheese=driver.findElement(By.name("cheese"));
            ByLinkText
            找到與Text屬性精確匹配的超鏈接。
            示例:如何使用該方法定位元素
            <a>cheese</a>
            WebElementcheese=driver.findElement(By.linkText("cheese"));
            ByPartialLinkText
            找到與Text屬性模糊匹配的超鏈接。
            示例:如何使用該方法定位元素
            <a>searchforcheese</a>
            WebElementcheese=driver.findElement(By.partialLinkText("cheese"));
            ByCSS
            這個(gè)方法名稱意味著它是一個(gè)CSS探測(cè)器。前提是瀏覽器默認(rèn)支持這種方法,建議根據(jù)W3C的標(biāo)準(zhǔn)文檔構(gòu)建CSS選擇器。如果瀏覽器不支持CSS選擇器,可以使用Sizzle。IE6,7和FireFox3.0就是使用Sizzle作為CSS查詢引擎。
            注意不是所有瀏覽器都使用同樣的CSS選擇器表達(dá)式,有些CSS可能只在某一個(gè)版本中生效。
            示例:如何使用該方法定位元素
            <divid="food"><spanclass="dairy">milk</span><spanclass="dairyaged">cheese</span></div>
            WebElementcheese=driver.findElement(By.cssSelector("#foodspan.dairy.aged"));
            ByXPath
            當(dāng)有需要時(shí),WebDriver還可以使用瀏覽器自帶的XPATH。對(duì)于那些不支持XPATH的瀏覽器,我們提供了WebDriver特有的實(shí)現(xiàn)方式。請(qǐng)確保熟悉XPATH在不同的引擎中的區(qū)別,否則會(huì)導(dǎo)致一些不可預(yù)料的問(wèn)題。
            Driver大小寫敏感屬性值是否可見(jiàn)是否支持XAPTH
            HtmlUnitDriver僅識(shí)別小寫可見(jiàn)是
            IEDriver僅識(shí)別小寫可見(jiàn)否
            FireFoxDiver大小寫不敏感可見(jiàn)是上面的表格有一些抽象,讓我們來(lái)看個(gè)例子
            <inputtype="text"name="example"/>
            <INPUTtype="text"name="other"/>
            List<WebElement>inputs=driver.findElements(By.xpath("http://input"));
            匹配結(jié)果如下
            XPATH表達(dá)式HtmlUnitDriverFireFoxDriverIEDriver
            //input122
            //INPUT020有些標(biāo)簽的屬性有默認(rèn)值,這種情況下不指定屬性值則匹配默認(rèn)值。比如,"input"標(biāo)簽"type"屬性默認(rèn)為"text"。使用XPATH的首要原則就是不要忽略這些隱藏的實(shí)現(xiàn)。
            使用JavaScript
            只要返回的是一個(gè)WebElement,你還可以使用任意的JS代碼查找Web元素,根據(jù)查詢結(jié)果會(huì)自動(dòng)修改為一個(gè)WebElement對(duì)象。
            一個(gè)簡(jiǎn)單的使用jQuery的例子:
            WebElementelement=(WebElement)((JavascriptExecutor)driver).executeScript("return$('.cheese')[0]");
            查找頁(yè)面中每個(gè)label的所有Input元素:
          List<WebElement>labels=driver.findElements(By.tagName("label"));
          List<WebElement>inputs=(List<WebElement>)((JavascriptExecutor)driver).executeScript(
          "varlabels=arguments[0],inputs=[];for(vari=0;i<labels.length;i++){"+
          "inputs.push(document.getElementById(labels[i].getAttribute('for')));}returninputs;",labels);
            7.3模擬用戶輸入行為
            我們已經(jīng)演示了在文本框輸入文本內(nèi)容,其他Web元素應(yīng)該如何操作呢?你可以觸發(fā)CheckBox的某個(gè)選項(xiàng),也可以選擇Select的某個(gè)選項(xiàng)。WebDriver處理Select元素也很簡(jiǎn)單。
          WebElementselect=driver.findElement(By.tagName("select"));
          List<WebElement>allOptions=select.findElements(By.tagName("option"));
          for(WebElementoption:allOptions){
          System.out.println(String.format("Valueis:%s",option.getAttribute("value")));
          option.click();
          }
            上面的例子,將選擇Web頁(yè)面中的第一個(gè)Select元素,并將循環(huán)打印出選項(xiàng)的取值并單擊選項(xiàng)?;蛟S你已經(jīng)注意到,使用這個(gè)方法并不是最有效的。WebDriver提供一個(gè)“Select”類,這個(gè)類的方法更適合于處理上述這種場(chǎng)景。
          Selectselect=newSelect(driver.findElement(By.tagName("select")));
          select.deselectAll();
          select.selectByVisibleText("Edam");
            上面的例子,首先去除選定第一個(gè)選項(xiàng)的焦點(diǎn),然后選中取值為"Edam"的選項(xiàng)。
            一旦你完成了所有表單字段的輸入,下一步就是提交表單。一種方法就是找到Web頁(yè)面中的Submit按鈕并單擊:
            driver.findElement(By.id("submit")).click();
            作為另一種選擇,WebDriver的Element類有一個(gè)更加便利的方法"sublmit"。如果你對(duì)表單中的某個(gè)Element使用該方法,WebDriver將會(huì)走讀其所在的DOM對(duì)象,直到找到其所屬的表單,并提交。如果該Element并不在某個(gè)表單中,將會(huì)拋出異常NoSuchElementException。
            element.submit();
            7.4在windows和frames間切換
            有些Web程序包含許多Frame和窗口,WebDriver提供"switchto"方法在這之間進(jìn)行切換:
            driver.switchTo().window("windowName");
            所有傳輸給WebDriver的指定將被傳輸給切換后的窗口。如何直到窗口的名稱呢?查看JS并打開(kāi)該窗口就可以了:
            <ahref="somewhere.html"target="windowName">Clickheretoopenanewwindow</a>
            作為另一種選擇,你可以使用一個(gè)“窗口句柄”傳遞給"switchTo().window()"方法。根據(jù)此方法,將會(huì)使用迭代器遍歷所有打開(kāi)的窗口:
            for(Stringhandle:driver.getWindowHandles()){
            driver.switchTo().window(handle);
            }
            你也可以在Frame之間切換(或者進(jìn)入Frame):
            driver.switchTo().frame("frameName");
            你還可以根據(jù)路徑使用Frame的子Frame,而且可以通過(guò)索引定位Frame。
            driver.switchTo().frame("frameName.0.child");
            以上方法將切換到名稱為“frameName”的Frame的第一個(gè)子Frame,所有Frame都是Web頁(yè)面的最頂端開(kāi)始計(jì)數(shù)。
            7.5彈出框
            Selenium2.0beta1版本,我們提供方法獲取彈出框。在你觸發(fā)彈出框的操作后,你可以用一下方法進(jìn)入彈出框:
            Alertalert=driver.switchTo().alert();
            以上方法將會(huì)返回當(dāng)前當(dāng)前打開(kāi)的alert對(duì)象,你可以對(duì)這個(gè)對(duì)象進(jìn)行任何可操作:點(diǎn)擊取消,點(diǎn)擊確定,關(guān)閉窗口,獲取alert的文本內(nèi)容等。這個(gè)接口在alerts、confirms、prompts對(duì)象上都有很好的應(yīng)用,具體請(qǐng)參見(jiàn)API文檔。
            7.6Navigation:瀏覽器本地歷史記錄
            前文中,我們使用get方法來(lái)獲取網(wǎng)頁(yè)(driver.get("http://www.example.com"))。正如你看到的,WebDriver有不少輕量級(jí)的功能聚焦的接口,Navigation就是這樣一個(gè)。正因?yàn)榧虞d網(wǎng)頁(yè)是一個(gè)再普通不過(guò)的需求,這個(gè)方法存在于Driver類下面,但是用法很簡(jiǎn)單:
            driver.navigate().to("http://www.example.com");
            重申一下,"navigate().to()"和"get()"做的是同樣的事情,只不過(guò)其中一個(gè)更適合打印。
            Navigate接口還提供方法可以在瀏覽器歷史記錄中前后翻頁(yè)。
            driver.navigate().forward();
            driver.navigate().back();
            請(qǐng)注意,以上功能完全取決于底層的瀏覽器。如果你習(xí)慣跨瀏覽器操作,當(dāng)你使用這些接口時(shí)可能會(huì)出現(xiàn)意想不到的的異常。
           7.7Cookies
            在我們開(kāi)始下一步的講解之前,你可能對(duì)WebDriver如何操作本地Cookies很感興趣。首先,你必須處于當(dāng)前Cookie的作用域。如果你在打開(kāi)一個(gè)網(wǎng)頁(yè)之前嘗試預(yù)置Cookie,而且你的主頁(yè)大到需要很長(zhǎng)一段時(shí)間來(lái)加載,這時(shí)候你需要找一個(gè)小點(diǎn)的網(wǎng)頁(yè)來(lái)替代,比如HTTP404網(wǎng)頁(yè)(http://example.com/some404page)。
          //打開(kāi)Cookie作用的網(wǎng)站
          driver.get("http://www.example.com");
          //設(shè)置全局Cookie
          Cookiecookie=newCookie("key","value");
          driver.manage().addCookie(cookie);
          //輸出當(dāng)前網(wǎng)頁(yè)所有可用的Cookie
          Set<Cookie>allCookies=driver.manage().getCookies();
          for(CookieloadedCookie:allCookies){
          System.out.println(String.format("%s->%s",loadedCookie.getName(),loadedCookie.getValue()));
          }
          //你又三種方法刪除Cookie
          //Byname
          driver.manage().deleteCookieNamed("CookieName");
          //ByCookie
          driver.manage().deleteCookie(loadedCookie);
          //Orallofthem
          driver.manage().deleteAllCookies();
             7.8修改用戶代理服務(wù)器
             對(duì)于FireFox來(lái)說(shuō)很簡(jiǎn)單:
          FirefoxProfileprofile=newFirefoxProfile();
          profile.addAdditionalPreference("general.useragent.override","someUAstring");
          WebDriverdriver=newFirefoxDriver(profile);
            7.9拖拽Web元素
            下面是一個(gè)拖拽Web頁(yè)面元素的例子,前提是本地事件必須可用。
            WebElementelement=driver.findElement(By.name("source"));
            WebElementtarget=driver.findElement(By.name("target"));
            (newActions(driver)).dragAndDrop(element,target).perform();
            8各種Driver的特性以及如何選擇合適Driver
            翻譯中
            9向前兼容:融合WebDriver和Selenium-RC
            翻譯中
            10為遠(yuǎn)程WebDriver單獨(dú)啟動(dòng)SeleniumServer
            翻譯中
            譯者注:
            1、原文鏈接:http://www.seleniumhq.org/docs/03_webdriver.jsp。
            2、文中只包含了java相關(guān)的操作,WebDriver還支持c#/Python/Ruby/Perl/PHP/Perl,如有需要,請(qǐng)閱讀原文。
            3、languagebinding,又叫g(shù)luecode,意思是膠水代碼,比如有個(gè)C++的lib庫(kù),java調(diào)用這個(gè)庫(kù)的api就叫javabinding。參考:http://en.wikipedia.org/wiki/Language_binding。
            4、措辭拙劣,有些單詞句子沒(méi)有深究就直譯了,深感從閱讀到翻譯差的不僅僅是一本字典,還有文化的差異。筆者強(qiáng)烈推薦直接閱讀官網(wǎng)上的原文,如果我的譯文給你造成誤解,深感不安。這也是最后三章不敢繼續(xù)班門弄斧的原因,等我對(duì)Selenium熟悉了之后再回來(lái)補(bǔ)全。

          posted on 2014-02-17 14:45 順其自然EVO 閱讀(2182) 評(píng)論(0)  編輯  收藏 所屬分類: selenium and watir webdrivers 自動(dòng)化測(cè)試學(xué)習(xí)

          <2014年2月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          2324252627281
          2345678

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 邹城市| 宁德市| 公安县| 沧源| 怀集县| 泰来县| 望江县| 申扎县| 庄河市| 新巴尔虎右旗| 绵阳市| 自治县| 桓台县| 阜宁县| 高阳县| 淳化县| 炉霍县| 富阳市| 贺兰县| 获嘉县| 宜兰县| 沙坪坝区| 开封市| 如皋市| 什邡市| 同德县| 宜兴市| 江门市| 鄯善县| 扬州市| 济南市| 美姑县| 兴仁县| 衡阳市| 昌吉市| 轮台县| 綦江县| 舞阳县| 卢湾区| 喀喇| 西畴县|