Selenium两万字大题库
測試最流行框架之一,可以學習一下。
?
填空
1、根據項目流程階段劃分軟件測試:(單元測試)、(集成測試)、(系統測試)、(驗收測試)
(單元測試)對程序中的單個子程序或具有獨立功能的代碼段進行測試的過程。
(集成測試)是在單元測試的基礎上,先通過單元模塊組裝成系統或子系統,再進行測試。重點是檢查模塊之間的接口是否正確。
(系統測試)是針對整個產品系統進行的測試,驗證系統是否滿足需求規格的定義,以及軟件系統的正確性和性能等是否滿足其需求規格的要求。
(驗收測試)是部署軟件之前的最后一個測試階段。驗收測試的目的是確保軟件準備就緒,向軟件購買者展示該軟件系統能夠滿足用戶的需求。
2、(白盒測試)與(黑盒測試),主要是根據軟件測試工作中對軟件代碼的可見程度進行的劃分。
3、性能測試是通過自動化的測試工具模擬多種(正常)、(峰值)以及(異常負載條件)來對系統的各項性能指標進行測試。軟件的性能包括很多方面,主要有(時間性能)和(空間性能)兩種。
5、TestNG數據提供者使用(??? @DataProvider? ??)注解來實現,返回類型是( Object[][]???? ??)。
6、Selenium使用(@FindBy )注解獲取頁面元素
7、Selenium通過(?? isSelected() ??)方法驗證一個復選按鈕是不是被選中或者未被選中
8、Selenium元素定位類型包含如下8種,它們都位于By類中并且都是靜態方法。它們分別是:By.id(),By.name(), By.className(),By.linkText(),By.partialLinkText(),(????? ??)、(????? ??)(????? ??)
By.id(), By.name(), By.tagName(), By.className(), By.linkText(), By.partialLinkText(), By.xpath, By.cssSelector().
9、Selenium組件有Selenium-RC、(??? Selenium WebDriver ?????)、(?? ?Selenium IDE? ???)、(Selenium Grid ????)。
10、Log4j優先級從高到低分別是:(????? ??)、ERROR、WARN、INFO、DEBUG, TRACE
由低到高
TRACE,DEBUG,INFO,WARN,ERROR,FATAL? ALL? OFF
12、findElements(arg0)返回的類型是( List<WebElement> ????????)。findElement()返回的類型是(WebElement)
14、需要使用(? ?JavaScript)語句調用HTML5對象提供的內部變量和函數來實現各類操作。
15、自動化框架常見的模式:(? 數據驅動框架??? ??)、(?? 關鍵字驅動框架? ???)、(? ?行為驅動框架? )、混合型測試框架
16、TestNG基于J2SE5.0的( ??注解???? )特性的而構建的輕量級的單元測試框架結構。
17、模擬鍵盤鼠標事件需要哪個類?(? ??Actions ????)(? ??Keys ????)
18、如何去定位屬性動態變化的元素?( xpath的contains函數 ??)
19、TestNG允許指定依賴關系的兩種實現方式:(在@Test注釋中使用屬性dependsOnMethods),(在@Test注釋中使用屬性dependsOnGroups)
20、TestNG可以通過兩種不同的方式將參數直接傳遞給測試方法:(使用testng.xml)、(使用數據提供者)
21、在Web應用中經常會遇到frame/iframe表單嵌套頁面的應用,WebDriver只能在一個頁面上對元素識別與定位,對于frame/iframe表單內嵌頁面上的元素無法直接定位。這時就需要通過(switchTo().frame())方法將當前定位的主體切換為frame/iframe表單的內嵌頁面中。
如果完成了在當前表單上的操作,則可以通過(switchTo().defaultContent())方法跳出表單。
21、在頁面操作過程中有時候點擊某個鏈接會彈出新的窗口,這時就需要主機切換到新打開的窗口上進行操作。WebDriver提供了switchTo().window()方法可以實現在不同的窗口之間切換
22、ITestResult是TestNG提供的一個接口,結合@AfterMethod,可以監聽@Test方法的執行狀態等信息
23、TestNG中,如果要在測試方法執行成功、失敗或者跳過時指定不同后續行為,可以利用ITestListener 監聽器。也可以直接繼承TestListenerAdapter類來實現。
24、TestNG的用例組織結構:Test Suite由一個或者多個Test組成,Test由一個或多個測試class組成,一個測試class由一個或多個測試方法組成
25、在testng.xml中(parallel)屬性,可以并行地執行測試方法
26、繼承LoadableComponent類可以在頁面加載的時候判斷是否加載了正確的頁面,只需要重寫load() 和isLoaded()兩個方法。此方式有助于讓頁面對象的頁面訪問操作更加健壯。
27、在分布式測試模式中,只能有一臺作為Hub計算機,Hub負責管理測試腳本,并負責發送腳本給其他的Node,Node節點會打開本地的瀏覽器完成測試任務并返回結果給Hub
28、python中在線安裝Selenium的命令(pip install selenium),查看Selenium是否安裝(pip show selenium),離線安裝,單擊 .tar.gz結尾的文件,并且對文件進行解壓,進入到解壓目錄中,通過python命令進行安裝。進入到目錄名中>(python setup.py install)
.whl 文件本質上面是一個 .zip 包格式進入到目錄名中>(pip install? selenium.whl)
29、Java+Selenium上傳本地文件;只要定位上傳按鈕,通sendKeys()添加本地文件路徑就可以了。
30、unittest.main()使用TestLoader類搜索所有包含在該模塊以test命名開頭的測試方法,并自動執行它們,執行方法的默認順序是:根據ASCII碼的順序加載測試用例
31、HTMLTestRunner是Python的標準庫unittest單元測試框架的一個擴展,用于生成HTML測試報告。
32、在python中,xlrd模塊實現對excel文件內容讀取,xlwt模塊實現對excel文件的寫入
33、HTMLTestRunner是Python的標準庫unittest單元測試框架的一個擴展,用于生成HTML測試報告。
?
34、Python對SMTP支持有smtplib和email兩個模塊,email負責構造郵件,smtplib負責發送郵件
選擇
Selenium
1、下面哪個方法是驗證復選框是不是被選中(????? )
A.isEnabled()?? ????????????????????B. isSelected()
C. isDisplayed()?????? ??????????????D. clear()
答案:B
?
2、下面哪個方法可以獲獲取當前頁面的URL(????? )
A.getClass()?? ????????????????????B. getCurrentUrl()
C. getPageSource()??? ??????????????D. getTitle()
答案:B
?
3、如何模擬瀏覽器的前進操作(?????? )
A.driver.navigate().back(); ?? ??? B. driver.navigate().toString()
C. driver.navigate().refresh();??? D. driver.navigate().forward();
答案:D
?
4、在顯示等待中,判斷元素是否存在的方法是(????? )
A. elementToBeClickable(locator)??
B. textToBePresentInElement(locator, text)
C. presenceOfElementLocated(locator)
D. titleContains(title)
答案:C
5、在對話框的操作,下列代碼實現的功能是(????? )
??? Alert alert =driver.switchTo().alert();
??????? alert.accept();)
A. 取消對話框????????? ?????B. 在對話框中輸入文本
C. 確定對話框??????? ???????D. 獲得對話框的文本內容
答案:C
6、選出在Java中有效的注釋聲明(??? )
A.//這是注釋?????????????? ?B. */這是注釋*/????
C. /這是注釋???????????????? D. **/這是注釋*/
答案:A
7、下列實例化瀏覽器對象錯誤的方式是(????? )
A. WebDriver driver = new? FirefoxDriver();
B. WebDriver driver = new InternetExplorerDriver();
C. WebDriver driver = new? WebDriver();
D. WebDriver driver = new ChromeDriver();
答案:C
8、什么樣的項目適合自動化測試(??? )
A. 軟件維護周期長。
B. 任務測試不明確,頻繁變動
C. 測試人員不具備較強的編程能力
D. 軟件系統界面不穩定,變動多
答案是:A
9、Webdriver的協議是什么?(????? )
A.Http?????????????????????????? B.The WebDriver Wire Protocol
C.The WebDriver Protocol???????? D.Tcp/IP
答案是B
10、怎樣去選擇一個下拉框中的value=apple? 下拉列表框?
A.selectByIndex(1) ??????????????B.selectByValue(“apple”)
C.selectByVisibleText(“apple”) D.select(“apple”)
11、一個登錄按鈕,除了用click方法點擊以外還有其他方式嗎?
A.hashCode()????????????????????? B.wait()
C.notify()??????????????????????? D. submit()
?
答案是:D
12、在顯示等待中,元素是否可用和被單擊是(????? )
A.titleContains(title)
B.textToBePresentInElement(locator,text)
C.presenceOfElementLocated(locator)
D.elementToBeClickable(locator)
答案是:D
13、(????? )是嵌入到Firefox瀏覽器中的一個插件,實現簡單的瀏覽器操作的錄制與回放功能,也可以將錄制的腳本導出成java、Python、Ruby、C#
A.Selenium-RC??????????????????????????? B.Selenium-IDE
C.Selenium-WebDriver???????????????????? D.Selenium-Grid
答案是:B
?
14、下列哪項屬于單元測試工具是(????? )
A.TestNG???????????????????????????? ?????B.UFT
C.Selenium?????????????????????????????? D.HttpClient
答案是:A
15、WebDriver在Selenium3中是(????? )???
A.常量????????????????????????????? B.類??
C.接口????????????????????????????? D.抽象類?
答案是:C
16、下列哪項不屬于Page Object 設計模式的優點()
A.減少代碼的重復? ??????????????B.測試數據和測試行為進行了完全的分離
C.提高測試用例的可維護性 ???????D.提高測試用例的可讀性
答案是:B
?
?
?
TestNG
1、TestNG如何設定測試用例的優先級(????? )???
A.@Test(priority=0)?????? ??????????B.@Priority=0???????????
C.@Test(dependsOnMethods="car")???? D.@Test(parameters=1)
2、TestNG如何對測試用例進行分組(????? )
A.@Test(name=0)???????????????????? B.@Test(enabled=false)
C.@Ignore?????????????????????????? D.@Test(groups="car")
3、一個類里面可能存在多個測試方法(被@Test注解的方法),默認測試方法的執行順序是(????? )
A.按照方法在類中的先后順序?? B.按照方法名的字典序(ascii)升序排序執行
C.隨機執行的???????????????? D.按照方法名的字典序(ascii)降序排序執行
4、下面哪個選項(????? )的作用是,被注釋的方法將在每一個測試用例調用前運行
A.@BeforeMethod???????????????????? B.@BeforeClass
C.@BeforeTest?????????????????????? D.@BeforeSuite
5、在testng.xml中,preserve-order=“true”的作用是(????? )???
A.運行所有的測試用例???
B.會在不同的線程中運行測試方法
C.可以保證節點下面的方法是按順序執行的???????????????????
D.運行失敗的測試用例
?
6、使用斷言判斷a是否等于b的方法是( ?????)
A. assertEquals(a,b) ?? ??????????B. assertSame(a, b)
C. assertTrue(a)???????????? ??????D. assertNotEquals(a, b)
?
7、使用TestNG斷言,測試a是否不等于b方法是(????? )
A.assertEquals(a,b)? ? ??????????B.assertSame(a, b)
C.assertTrue(a)?????????????????? D.assertNotEquals(a, b)
8、用TestNG跳過某個測試方法的實現()?
A. @Test(enabled=true)? ??? ???????????B. @Test(enabled=false)
C. @Ignore??????????????????????? ??D. @Test(parameters=1)
9、TestNG中,(?? )可以實現測試方法的參數化
A. @Test(dataProvider = "aaa")? ??? ???????????B. @Parameters
C.@Parameter????????? ???????????????????????D. @DataProvider
?
簡答
1、手工測試的局限性?
參考答案:
2)簡單的功能性測試用例在每一輪測試中都不能少,而且具有一定的機械性、重復性,工作量往往較大。
3)如果有大量(幾千)的測試用例,需要在短時間內(1天)完成,手工測試幾乎不可能做到。
2、自動化測試的優勢?
參考答案:
7)軟件測試實行自動化進程,絕不是因為厭煩了重復的測試工作,而是因為測試工作的需要,更準確地說是回歸測試和系統測試的需要。
3、什么項目適合做自動化測試?
參考答案:
1)任務測試明確,需求不會頻繁變動。
2)每日構建后的測試驗證。
3)比較頻繁的回歸測試。
4)軟件系統界面穩定,變動少。
5)需要在多平臺上運行的相同測試案例、組合遍歷型的測試,大量的重復任務。
6)軟件維護周期長,資源豐富。
7)項目進度壓力不太大。
8)被測軟件系統開發比較規范,能夠保證系統的可測試性。
9)具備大量的自動化測試平臺。
10)腳本重復利用率高。
4、自動化測試框架的步驟是什么?
參考答案:
1)根據測試業務的手工測試用例,選出需要自動化的用例(例如:冒煙)
2)根據可自動化執行的測試用例,分析出測試框架需要模擬的手工操作和重復高的測試流程或邏輯
3)將重復高的測試流程在代碼中實現,并進行封裝
4)根據業務的類型和本身的技術能力選擇數據驅動測試、關鍵字驅動測試框架、混合型框架還是行為測試框架
5)確定框架類型后,將框架中的常用的瀏覽器選擇、測試數據處理、文件操作、數據庫操作、頁面元素的原始操作、日志和報告等功能進行方法的封裝實現
6)對框架代碼進行集成測試和系統測試,采用PO模式和TestNG框架編寫測試腳本,使用框架進行自動化測試,驗證框架的功能是否可以滿足自動化測試的需求。
7)編寫自動化測試框架的常用API,以供他人參閱
8)在測試組中內部進行培訓和推廣
9)不斷收集測試過程中的框架使用問題和反饋意見,不斷增加和優化自動化框架的功能,不斷增強框架中復雜操作的封裝效果,盡量降低測試腳本的編寫復雜性
10)定期評估測試框架的使用效果,評估自動化測試的投入和產出比,再逐步推廣自動化框架的應用范圍
5、請對Martin Fowler大師在測試金字塔模型的基礎上提出分層自動化測試的概念,請進行描述。
1)單元測試自動化:在面向過程編程中,單元也可以是整個模塊,單常見的是單個函數或過程。
在面向對象編程中,單元通常是整個接口,例如類,但可以是單獨的方法。需要規范的來做單元測試同樣需要相應的單元測試框架,如java的Junit、testNG,C#的NUint,Python的unittest、pytest等,幾乎所有的主流語言,都會有其對應的單元測試框架。
2)接口測試自動化:Web應用的接口測試大體分為兩類:模塊接口測試和Web接口測試。
模塊接口測試,主要測試模塊之間的調用與返回。它主要強調對一個類方法或函數的調用,并對返回結果的驗證,所用到的測試工具與單元測試相同。
Web接口測試又可分為兩類:服務器接口測試和外部接口測試。
3)UI層的自動化測試: UI層的功能進行測試。例如,不斷重復的對一個表單提交,結果查詢等功能進行測試,我們可以通過相應的自動化測試工具來模擬這些操作,從而解放重復的勞動。
?
?
6、請描述Selenium Webdriver的工作原理。
參考答案:
1)啟動瀏覽器后,selenium-webdriver會將目標瀏覽器綁定到特定的端口,啟動后的瀏覽器則作為webdriver的remote server,接受測試腳本的命令。
2)客戶端(測試腳本),借助ComandExecutor發送HTTP請求給sever端(通信協議:The WebDriver Wire Protocol,在HTTP request的body中,會以WebDriver Wire協議規定的JSON格式的字符串來告訴Selenium希望瀏覽器接下來做什么事情)。
3)Sever端需要依賴原生的瀏覽器組件(如geckodriver.exe),來轉化瀏覽器native的調用來完成操作
?
7、現在需要你設計一個自動化框架,簡述自動化框架的構成。???
1)utils包:實現測試過程中調用的工具類方法,例如:文件操作、mapObject、頁面對象的操作方法
2)appModules包主要用于實現復用的業務邏輯封裝方法
3)pageObjects包:用于實現被測試的頁面對象
4)testCases 包 :具體的測試方法
5)dataprovider包:提供數據驅動的類,txt驅動,excel驅動,數據庫的驅動
?????????????
8、Webdriver的三種等待方式是哪些,并簡述它們的作用。
參考答案
1)強制等待 Thread.sleep(3000)
2)顯式等待,就是明確的要等到某個元素的出現或者是某個元素的可點擊等條件,等不到,就一直等,除非在規定的時間之內都沒找到,那么就拋出Exception。
WebDriverWait wait =new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("")));
3)隱式等待,就是在創建driver時,為瀏覽器對象設置一個全局的等待時間。這個方法是得不到某個元素就等待一段時間,直到拿到某個元素位置。過了這個時間如果對象還沒找到的話就會拋出NoSuchElement異常。
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
?
9、Selenium 有幾種定位方式,請詳細列出?
參考答案:
一共有8種類型的定位方式,它們都位于By類中并且都是靜態方法。它們分別是:By.id(), By.name(), By.tagName(), By.className(), By.linkText(), By.partialLinkText(), By.xpath, By.cssSelector().
10、close()和quit()方法的區別是什么?
close方法關閉當前的瀏覽器窗口;
quit方法不僅關閉窗口,還會徹底的退出webdriver,釋放與driver server之間的連接。
11、Selenium 包含哪些組件,簡述各組件的作用?
參考答案:
Selenium RC ,Selenium Grid,Selenium IDE ,Selenium WebDriver
?
webdriver是按照server–client的經典設計模式設計的:
?server端就是remote server,可以是任意的瀏覽器:測試腳本啟動瀏覽器后,該瀏覽器就是remote server,它的職責就是等待client發送請求并做出響應
?client端(測試代碼):測試代碼中的一些行為,比如打開瀏覽器,轉跳到特定的url等操作是以http請求的方式發送給被server端(被測瀏覽器)server接受請求,并執行相應操作,并在response中返回執行狀態、返回值等信息。
Selenium IDE 是嵌入到Firefox瀏覽器中的一個插件,實現簡單的瀏覽器操作的錄制與回放功能,也可以將錄制的腳本導出成java、Python、Ruby、C#。
Selenium Grid是一種自動化的測試輔助工具,Grid通過利用現有的計算機基礎設施,能加快Web應用的功能測試。利用Grid可以很方便地實現在多臺機器上和異構環境中運行測試用例
12、如何處理一個alert彈窗?
參考答案
處理alert彈窗,需要先跳轉到alert上,然后在點擊確定或者取消按鈕,最后返回到原始的頁面,例如:
String mainPage = driver.getWindowHandle();??
Alert alt = driver.switchTo().alert(); //跳轉到alert上面
alt.accept(); //點擊確定
alt.dismiss(); // 點擊取消
//回到原始的頁面
driver.switchTo().window(mainPage);
13、什么是page object設計模式?
使用面向對象的設計模式,頁面對象模式將測試代碼和被測試頁面的頁面元素及其操作方法進行分離,以此降低頁面元素變化對測試代碼的影響。
每一個測試頁面都會被單獨定義一個類,類中會定位所有需要參與測試的頁面元素對象,并且定義操作每一個頁面元素對象的方法。
14、Selenium Grid作用是什么?
專門用于遠程分布式測試或并發測試的組件,可以在不同機器上測試不同瀏覽器
?
15、怎么判斷元素是否存在?
判斷元素是否存在和是否出現不同, 判斷是否存在意味著如果這個元素壓根就不存在, 就會拋出NoSuchElementException
這樣就可以使用try catch,如果catch到NoSuchElementException 就返回false
16、如何判斷元素是否出現?
判斷元素是否出現,存在兩種情況,一種是該元素壓根就沒有,自然不會出現;另外一種是有這樣的元素,但是是hidden狀態
可以通過先判斷是否存在,如果不存在返回false;如果存在再去判斷是否displayed
?
17、怎樣選擇下拉菜單的元素
如果這個下拉菜單是通過select標簽創建的,可以通過以下代碼實現
WebElement selector = driver.findElement(By.id("Selector"));
Select select = new Select(selector);
選擇select的option有以下三種方法
?
selectByIndex(int index) 通過index
selectByVisibleText(String text) 通過匹配到的可見字符
selectByValue(String value) 通過匹配到標簽里的value
?
如果這個下拉菜單不是通過select標簽創建的,我們可以通過xpath定位元素,然后進行點擊
18、如何使用webdriver執行一個鼠標右鍵點擊操作
鼠標的操作使用Actions類
????? Actions actions=new Actions(driver);
????? actions.moveToElement(webElement).perform();
????? actions.contextClick().perform();
?
?
補充:
doubleClick(WebElement target)雙擊
clickAndHold(WebElement target)長按
dragAndDrop(WebElement source, WebElement target)拖動
perform() 執行所有Actions中存儲的行為
release()? 釋放鼠標
//按住左鍵向右移動600,向下移動200,釋放左鍵
action.clickAndHold().moveByOffset(600, 200).release().perform();
?
19、如果在測試過程中,發現click();發現沒有響應,該怎么辦?
driver.findElement(By.xpath("//input[@type='submit']")).click();發現沒有響應,該怎么辦?
參考答案:
JavascriptExecutor jse=(JavascriptExecutor) driver;
?? jse.executeScript("arguments[0].click();", element);
?
20、如何模擬滾動條向下滑動?
參考答案:
JavascriptExecutor jse=(JavascriptExecutor) driver;
jse.executeScript("window.scrollBy(0,800);”);?
?
21、java+Selenium實現截屏的操作
public void screenShot(String name) throws IOException {
????? SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd-HHmmss");
????? String nowDateTime = sdf.format(new Date());
????? File s_file = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
????? Files.copy(s_file, new File("D:\\demo\\" + name + "-" + nowDateTime+ ".jpg"));
??
?? }
22、怎么驗證一個復選框是不是被選中或者未被選中
參考答案:
使用isSelected()方法,例如
driver.findElement
(By.id("xpath of checkbox")).isSelected(),如果返回true說明被選中,如果返回false,說明未選中
?
23、如何使用Selenium執行一個拖拽的操作?
Actions類
Actions actions=new Actions(driver);
actions.dragAndDrop(source, target).perform();
24、findElements(By by); findElement(By by)的區別是什么?
兩者都是查找元素的方法,findElement是查找一個頁面元素,它只會返回一個頁面元素類型WebElement。findElements會查找頁面上所有符合匹配的元素,它返回的是一個元素集合List<WebElement>。
鍵盤事件
28、如何使用鍵盤事件,點擊向下鍵和Tap鍵
Keys()類提供了鍵盤上幾乎所有按鍵的方法。
??? Actions action = new Actions(driver);
//鍵盤向下鍵
??????? action.sendKeys(Keys.DOWN).build().perform();
???????
?
sendKeys(Keys.BACK_SPACE)? 刪除鍵(BackSpace)
sendKeys(Keys.SPACE)? 空格鍵(Space)
sendKeys(Keys.TAB)?? 制表鍵(Tab)
sendKeys(Keys.ESCAPE)? 回退鍵(Esc)
sendKeys(Keys.ENTER)?? 回車鍵(Enter)
29、在一個頁面上,點擊一個鏈接之后不會在當前頁面上打開此鏈接而是新開一個窗口打開此頁面。
Selenium也提供了對應的API來處理。簡述這個查找新窗口的過程。
參考答案:
1)首先需要了解下,每個窗口都是有個句柄的,可以理解為瀏覽器窗口的標識符。可以根據這些標識符來確定新開的窗口,具體思路如下:
首先獲得當前句柄:
String current_handles = driver. getWindowHandle();
2)出現新窗口之后,獲取所有窗口句柄
Set<String> all_handles = driver.getWindowHandles();
3)循環判斷,把當前句柄從所有句柄中移除,剩下的就是想要的新窗口
Iterator<String> it = all_handles.iterator();
while(it.hasNext()){
if(current_handles == it.next()) continue;
//跳入新窗口
WebDriver window = dr.switchTo().window(it.next());
}
?
30、Selenium Grid的使用過程
1. 找到兩臺計算機A作為Hub(代碼),B作為Node(jdk,selenium.jar,瀏覽器)
2. 在計算機A中打開cmd窗口,在D:/demo輸入語句:
java? –jar??? selenium.jar –role ?hub
使用java命令把jar包文件作為程序,并且將role參數傳遞給jar文件的參數,以此來啟動管理中心
3. 在計算機B打開窗口,打開cmd窗口,在D:/demo下輸入語句:java–jar selenium.jar? -role? node? -port 6655? -hub?
http://10.7.90.240:4444/grid/register?
4、在計算機A中訪問http://localhost:4444/grid/console,驗證Node是否注冊成功
5、在A 機器上編寫測試分布式代碼
31、HTMLTestRunner的使用步驟?
參考答案:
使用步驟:
1、導入HTMLTestRunner
2、通過open()方法以二進制寫方式打開當前目錄的result.html,如果沒有,則自行創建該文件
3、調用HTMLTestRunner下的HTMLTestRunner類,stream指定測試報告文件,title定義測試報告的標題,description用于定義測試報告的副標題
4、通過HTMLTestRunner的run()方法來運行測試套件中所組裝的測試用例
5、通過close()關閉測試報告文件
?
1、TestNG中注解:
@BeforeSuite,@AfterSuite,@BeforeTest, @AfterTest
@BeforeGroups,@AfterGroups,@BeforeClass,@AfterClass
@BeforeMethod,@AfterMethod ,@Test
?
2、TestNG中什么是斷言(Assert)?
Assert用于驗證結果是不是達到預期的結果,如果在執行測試的時候測試用例失敗了,它會停止執行當前的測試用例并提供斷言日志。
3、什么是數據驅動模式,TestNG如何從Excel讀數據的參數化?
參考答案:
1)相同的測試腳本使用不同的測試數據來執行,測試數據和測試行為進行了完全的分離。這樣的測試腳本設計模式稱為數據驅動。
2)
引入apache poi的jar包,使用這個包的類和方法可以從Excel讀取數據
使用testNG 的注解,下定義一個方法返回類型Object[][]的方法用來接收從excel讀取的數據
定義一個需要參數化的@Test方法,指定數據來自上面第二步的DataProvider
?
4、如何使用TestNG+Ant創建無人值守的測試?
參考答案:
1)編寫測試代碼,運行通過
2)編寫testng.xml
3)編寫build.xml(執行testng.xml)
5)使用Windows中任務創建定時任務
5、使用TestNG的優勢是什么?
(1)TestNG可以基于group的方式去執行測試
(2)Tesng注釋很好理解
(3)Testng允許并行測試
(4)報告展示多樣化,可自行開發測試報告插件以及測試監聽器等
(5)執行測試的順序可通過testng修改
?
6、什么是持續集成?
持續集成源于極限編程(XP),是一種軟件實踐,軟件開發過程中集成步驟是一個漫長并且無法預測的過程。集成過程中可能會爆發大量的問題,因此集成過程需要盡可能小而多,實際上持續集成講的是不斷的去做軟件的集成工作。持續集成,最簡單的形式是包括一個監控版本控制(Github)變化的工具。當變化被發覺時,這個工具可以自動的編譯并測試應用。
?
7、SoftAssert的特點,并對軟斷言進行舉例說明
1) 如果一個斷言失敗,會繼續執行這個斷言下的其他語句或者斷言
3) 調用assertAll()在該用例的最后一個斷言后面
4) 軟斷言的類,叫SoftAssert.java,這個類是需要創建實例對象,才能調用相關實例方法進行軟斷言
?
舉例
@Test
??? public void test2() {
??????? ?System.out.println("Test start");?
??? ??????? SoftAssert assertion = new SoftAssert();?
??? ??????? assertion.assertEquals(12, 13,"兩者不相等");?
??? ??????? System.out.println("Test complete");?
??? ??????? System.out.println(3+8);?
??? ??????? assertion.assertAll();?
??? }
8、使用TestNG編寫測試用例的步驟。
?
參考答案:
?
判斷
1、由于自動化測試的諸多好處,自動化終將完全取代手工測試(錯)
10、Selenium可以修改頁面元素的屬性,例如背景顏色(??? 對?? )
11、XPath是一種在XML文檔中定位元素的語言。因為HTML可以看作XML的一種實現,所以Selenium用戶可以使用這種強大的語言在Web應用中定位元素(對)
12、在 @Listeners 中添加監聽器跟在 testng.xml 添加監聽器的不同之處在于,它不能添加 IAnnotationTransformer 和 IAnnotationTransformer2 監聽器。原因是因為這兩種監聽器必須在更早的階段添加到 TestNG 中才能實施修改注釋的操作,所以它們只能在 testng.xml 添加。(對)
13、TestNG執行測試方法之前,會重新實例化測試類,即執行構造方法。(??? 對?? )
14、如果繼承父類,會先執行父類的構造方法。(??? 對?? )
15、一個類里面可能存在多個測試方法(被@Test注解的方法),默認測試方法的執行順序是按照方法名的字典序(ascii)升序排序執行的。
15、硬斷言如果一個斷言失敗,會繼續執行這個斷言下的其他語句或者斷言。(錯)
16、在分布式測試模式中,只能有一臺作為Hub計算機,一臺Node。(錯)
17、Hub分發的測試用例會在多個Node中執行。(??? 對?? )
?
?
?
編程題
?
使用TestNG+JavaMail,編寫監聽器類TestListener1 ,實現把測試結果以文本的方式發送至test333@126.com。發件箱是test111@126.com。授權碼123456qwe。
package ch14.javamail;
import org.testng.Assert;
import org.testng.annotations.Test;
public class Demo1 {
??
?? @Test
?? public void test1() {
????? Assert.assertEquals(1, 2);
?? }
??
?? @Test
?? public void test3() {
????? Assert.assertEquals(1, 4);
?? }
??
?? @Test
?? public void test2() {
????? Assert.assertEquals(1, 1);
?? }
?
}
?
?
參考答案:
public class TestListenerWeb extends TestListenerAdapter {
?? @Override
?? public void onFinish(ITestContext testContext) {
????? StringBuilder sb = new StringBuilder();
????? ITestNGMethod method[] = this.getAllTestMethods();
????? sb.append("此次一共運行測試用例"+method.length+"\n");
????? sb.append("失敗的測試用例如下:"+"\n");
?
????? List<ITestResult> failedList = this.getFailedTests();
??
????? for(ITestResult result:failedList) {
????????? String f_method=result.getInstanceName()+"."+result.getName();
????????? sb.append(f_method+"\n");
????? }
????? MailUtil1.sendMail(sb.toString());
?
?? }
?
}
?
?
?
public class MailUtil1 {
?
?? static String from="test2014123@126.com";
?? static String auth_code="123456abcd";//授權碼,不是密碼
?? static String to="626231936@qq.com";
??
?? public static void sendMail(String content) {
????? Properties prop=new Properties();
????? prop.put("mail.transport.protocol", "smtp");
????? prop.put("mail.smtp.host", "smtp.126.com");
????? prop.put("mail.smtp.auth", true);
????? Session session=Session.getInstance(prop, new Authenticator() {
????????? @Override
????????? protected PasswordAuthentication getPasswordAuthentication() {
???????????? return new PasswordAuthentication(from,auth_code );
????????? }
?????????
????? });
?????
????? Message message=new MimeMessage(session);
????? try {
????????? message.setFrom(new InternetAddress(from));
????????? message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
????????? message.setSubject("Hello,測試");
????????? message.setText(content);
????????? Transport.send(message);
?????
????? } catch (Exception e) {
????????? // TODO Auto-generated catch block
????????? System.out.println(e.toString());
????? }
??
?? }
}
public class FileDataProvider {
?? public Object[][] getTestDataByTxt(String fileName) {
????? File file = new File(fileName);
????? Object[][] data = null;
????? FileInputStream fis = null;
????? InputStreamReader isreader = null;
????? BufferedReader breader = null;
????? String record;
????? try {
????????? fis = new FileInputStream(file);
????????? isreader = new InputStreamReader(fis, "UTF-8");
????????? // 設定utf-8,使用帶緩沖區的字符輸入流BufferedReader讀取文件內容
????????? breader = new BufferedReader(isreader);
????????? int cols = 0;
????????? // 忽略第一行
????????? record = breader.readLine();
????????? if (null == record) {
???????????? return null;
????????? } else {
???????????? cols = record.split("\t").length;
????????? }
????????? List<String> datalist = new ArrayList<String>();
????????? // 遍歷讀取文件除第一行外的所有內容,儲存在名為datalist的ArrayList中
????????? while ((record = breader.readLine()) != null) {
???????????? datalist.add(record);
????????? }
????????? data = new Object[datalist.size()][cols];
????????? String[] strs;
????????? for (int i = 0; i < datalist.size(); i++) {
???????????? strs = datalist.get(i).split("\t");
???????????? for (int j = 0; j < cols; j++) {
??????????????? data[i][j] = strs[j];
???????????? }
????????? }
????? } catch (Exception e) {
????????? // TODO Auto-generated catch block
????????? e.printStackTrace();
????? }
????? return data;
?? }
?
?
}
?
?
public class ExcelDataProvider {
?? @DataProvider(name = "aaa")
?? public Object[][] getData() throws IOException {
?
????????? return getTestDataByExcel("data/user.xlsx","Sheet1");
??
?? }
?
?? @Test(dataProvider = "aaa")
?? public void test1222(String a, String b) {
????? System.out.println(a);
?? }
?
?? public Object[][] getTestDataByExcel(String fileName, String sheetName)
????????? throws IOException {
????? File file = new File(fileName);
????? FileInputStream inputstream = new FileInputStream(file);
????? Workbook wbook = null;
????? String fileExtensionName = fileName.substring(fileName.indexOf("."));
????? if (fileExtensionName.equals(".xlsx")) {
????????? wbook = new XSSFWorkbook(inputstream);
?????
????? } else if (fileExtensionName.equals(".xls")) {
????????? wbook = new HSSFWorkbook(inputstream);
????? }
????? Sheet sheet = wbook.getSheet(sheetName);
????? // 通過sheetName生成Sheet對象
????? int rowCount = sheet.getLastRowNum() - sheet.getFirstRowNum();
????? // 獲取當前sheet行數,行號和列號都是從0開始
????? List<Object[]> records = new ArrayList<Object[]>();
????? // 使用雙循環獲取excel文件的所有數據(第一行除外)
????? for (int i = 1; i < rowCount + 1; i++) {
????????? Row row = sheet.getRow(i);
????????? String fields[] = new String[row.getLastCellNum()];
????????? for (int j = 0; j < row.getLastCellNum(); j++) {
???????????? // 獲取單元格數據
???????????? fields[j] = row.getCell(j).getStringCellValue();
????????? }
????????? records.add(fields);
????? }
????? Object[][] results = new Object[records.size()][];
????? for (int i = 0; i < records.size(); i++) {
????????? results[i] = records.get(i);
????? }
????? return results;
?? }
??
?
}
?
?
表格的處理
1)從頁面表格中找到第二行第二列的輸入框,并輸入“hello”(10分)
提示:驅動路徑為D:\\demo\\geckodriver.exe,要求使用firefox瀏覽器,安裝路徑為默認路徑,測試路徑:http://localhost:8032/test/table.html
注意:代碼不唯一,可以使用不同的方式識別對象,能夠正確識別對象均可得分
?
參考答案:
?
@Test
???????? public void test1(){
????????????????? //遍歷所有的表格內的文本
???????? System.setProperty("webdriver.gecko.driver", "D:\\demo\\geckodriver.exe");
wd = new FirefoxDriver();
???????? ?wd.get("http://localhost:8032/test/table.html");
???????? ?WebElement t1 = wd.findElement(By.id("table1"));
???????? ?List<WebElement> rows=t1.findElements(By.tagName("tr"));
???????? ?List<WebElement> cols1= rows.get(1).findElements(By.tagName("td"));
???????? ?WebElement cellInput=cols.get(1).findElement(By.tagName("input"));
???????? ? element1.sendKeys("hello");
?? wd.quit();.?????? ?
???????? }
2)課上練習,Mymovie的例子
?
?
?? WebDriver driver = null;
?? String nodeUrl="http://192.168.154.121:6655/wd/hub";
?? String baseUrl="htttp://www.baidu.com/";
?? @Test
?? public void testFF() throws MalformedURLException, InterruptedException{
?? DesiredCapabilities capability = DesiredCapabilities.firefox();
?? this.driver = new RemoteWebDriver(new URL(nodeUrl),capability);
?? this.driver.get(baseUrl);
?? Thread.sleep(5000);
?? this.driver.quit();
?? }
??
提示:<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite1" verbose="1">
?
package edu.demo;
?
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeSuite;
?
?
public class BaseTest {
?? public BaseTest() {
????? System.out.println("執行父類的構造方法");
?? }
??? @BeforeSuite
??? public void bs() {
??? ?? System.out.println("BaseTest-BeforeSuite");
??? }
??? @BeforeClass
??? public void bc() {
??? ?? System.out.println("BaseTest-BeforeClass");
??? }
??
}
package edu.demo;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
public class Demo2 extends BaseTest {
????? @BeforeMethod
?? ? public void bm() {
??? ?? System.out.println("Demo2-BeforeMethod");
??? }
?? @Test
?? public void test2() {
????? System.out.println("test2");
?? }
????? @Test
?? public void atest2() {
????? System.out.println("atest2");
?? }
}
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite1" verbose="1">
?? <test name="test1">
????? <classes>
????????? <class name="edu.demo.Demo2" />
????? </classes>
?? </test>
</suite>
public class ReadProperties {
?
?? public static final String filePath="conf/config.properties";
??
?
?? public static String getPropertyValue(String key) throws IOException {
????? Properties prop = new Properties();
????? FileInputStream fis = new FileInputStream(filePath);
????? prop.load(fis);
????? fis.close();
????? return prop.getProperty(key);
?????
?? }
}
?
?
public class LoginPage {
// 1、通過@FindBy的方式找出所有涉及到操作的頁面元素
// 2、在構造方法中實例化WebDriver對象,并初始化所有的頁面元素
// 3、實現所有的操作方法
?
?? private WebDriver driver =null;
?? @FindBy(name="username")
?? public WebElement username;
??
?? @FindBy(name="password")
?? public WebElement password;
??
?? @FindBy(linkText="退出")
?? public WebElement quit;
??
?? @FindBy(xpath="//input[@type='submit']")
?? public WebElement submitBtn;
??
// public Select Fruit;
??
?? public LoginPage2(WebDriver driver) {
?? PageFactory.initElements(driver, this);
?? this.driver=driver;
?? }
??
?? public void openUrl() {
?? ?? this.driver.get("http://localhost:8032/mymovie/admin.php/");
?? }
?? public WebDriver getDriver() {
????? return driver;
?? }
??
?? public void login(String u_name,String u_password) throws InterruptedException {
?
????? this.username.sendKeys(u_name);
????? this.password.sendKeys(u_password);
????? this.submitBtn.click();
????? Thread.sleep(3000);
?? }
??
}
?
public class BaseTest {
?
?? public WebDriver wd = null;
?? public JavascriptExecutor jse = null;
?? public Actions action = null;
?
?? @BeforeClass
?? public void setUpBrowser() throws InterruptedException {
????? System.setProperty("webdriver.gecko.driver", "D:\\demo\\geckodriver.exe");
?? System.setProperty("webdriver.firefox.bin", "D:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe");
????? wd = new FirefoxDriver();
????? jse = (JavascriptExecutor) wd;
????? wd.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
????? action = new Actions(wd);
?
?? }
?
?? @AfterClass
?? public void quitBrower() {
????? if (wd != null) {
????????? wd.quit();
????? }
?? }
public class LoginPage2Test? extends BaseTest{
?? LoginPage2 lp;
?? @BeforeClass
?? public void init(){
????? ? lp =new LoginPage2(wd);
????? ?
?? }
?? @BeforeMethod
?? public void Open() {
????? lp.openUrl();
??
}
?? @Test
?? public void testLoginSuccess() throws InterruptedException {
?
????? lp.login("admin", "admin");
????? assertTrue(lp.getDriver().getPageSource().contains("退出"));
?? }
總結
以上是生活随笔為你收集整理的Selenium两万字大题库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CHIL-ORACLE-创建默认约束
- 下一篇: leetcode867. 转置矩阵