在開始自動化時(shí),您可能會遇到各種可能包含在自動化代碼中的方法,技術(shù),框架和工具。有時(shí),與提供更好的靈活性或解決問題的更好方法相比,這種多功能性導(dǎo)致代碼更加復(fù)雜。在編寫自動化代碼時(shí),重要的是我們能夠清楚地描述自動化測試的目標(biāo)以及我們?nèi)绾螌?shí)現(xiàn)它。
話雖如此,編寫“干凈的代碼”以提供更好的可維護(hù)性和可讀性很重要。編寫干凈的代碼也不是一件容易的事,您需要牢記許多最佳實(shí)踐。以下主題突出顯示了編寫更好的自動化代碼應(yīng)獲得的8條銀線。
?
1.命名約定
當(dāng)我們從手動轉(zhuǎn)向自動化或?qū)嶋H上以任何編程語言編寫代碼時(shí),這確實(shí)是要牢記的經(jīng)驗(yàn)法則之一。遵循正確的命名約定有助于更輕松地理解代碼和維護(hù)。此命名約定暗含變量,方法,類和包。例如,您的方法名稱應(yīng)特定于其用途。“ Register_User()”方法描述了在該方法中顯示用戶注冊的方法。明確定義的方法名稱增加了腳本的易于維護(hù)和可讀性。這同樣適用于變量命名。我注意到許多人提到變量為a,b,c等,甚至將Web元素稱為Weblelement1,Webelement2等。這樣一來,用戶看不到變量名與預(yù)期的一樣。
以下是顯示命名錯誤的示例:
public void Register_User() throws InterruptedException
{
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
driver.get("https://www.lambdatest.com/ ");
driver.manage().window().maximize();
WebElement web1= driver.findElement(By.xpath("http://a[text()='Free Sign Up']"));
web1.click();
WebElement web2=driver.findElement(By.xpath("http://input[@name='organization']"));
web2.sendKeys("LambdaTest");
WebElement web3=driver.findElement(By.xpath("http://input[@name='first_name']"));
web3.sendKeys("Test");
WebElement web4=driver.findElement(By.xpath("http://input[@name='last_name']"));
web4.sendKeys("User");
WebElement web5=driver.findElement(By.xpath("http://input[@name='email']"));
web5.sendKeys("sadhvi.singh@navyuginfo.com");
WebElement web6=driver.findElement(By.xpath("http://input[@name='password']"));
web6.sendKeys("TestUser123");
WebElement web7=driver.findElement(By.xpath("http://input[@name='phone']"));
web7.sendKeys("9412262090");
WebElement web8=driver.findElement(By.xpath("http://button[text()='SIGN UP']"));
web8.click();
Thread.sleep(3500);
}
上面的代碼顯示了“ method1”如何不向用戶提供任何線索,就像該方法的確切作用一樣。另外,所有的web元素都通過web1,web2等表示。用戶無法識別哪個(gè)Web元素捕獲了哪個(gè)字段。
對于上述相同的代碼,可以如下標(biāo)記正確的表示方式:
public void Register_User() throws InterruptedException
{
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
driver.get("https://www.lambdatest.com/ ");
driver.manage().window().maximize();
WebElement link= driver.findElement(By.xpath("http://a[text()='Free Sign Up']"));
link.click();
WebElement organization=driver.findElement(By.xpath("http://input[@name='organization']"));
organization.sendKeys("LambdaTest");
WebElement first_name=driver.findElement(By.xpath("http://input[@name='first_name']"));
first_name.sendKeys("Test");
WebElement last_name=driver.findElement(By.xpath("http://input[@name='last_name']"));
last_name.sendKeys("User");
WebElement email=driver.findElement(By.xpath("http://input[@name='email']"));
email.sendKeys("sadhvi.singh@navyuginfo.com");
WebElement password=driver.findElement(By.xpath("http://input[@name='password']"));
password.sendKeys("TestUser123");
WebElement phone_number=driver.findElement(By.xpath("http://input[@name='phone']"));
phone_number.sendKeys("9412262090");
WebElement button=driver.findElement(By.xpath("http://button[text()='SIGN UP']"));
button.click();
Thread.sleep(3500);
String url= driver.getCurrentUrl();
assertEquals("fail- unable to register", url, "https://accounts.lambdatest.com/user/email-verification");
}
在這里,方法名稱'Register_User'通過名稱明確定義了用戶,指示該方法包含與用戶注冊相關(guān)的代碼。同樣,所有Web元素或變量都具有與用于定義意圖的捕獲字段相關(guān)的名稱。
通常,通常鼓勵使用駝峰式大小寫來記錄方法或變量,因?yàn)樗诳勺x性和維護(hù)腳本方面更加清晰。
2.減少,重用和回收
確保將您的方法分解到用戶場景的最小塊上非常重要。它們應(yīng)涵蓋簡單和單一的流程。不要讓您的方法與單一方法涵蓋的多個(gè)功能過于復(fù)雜。例如,登錄功能需要在應(yīng)用程序上注冊用戶。將您的注冊功能保留在另一個(gè)方法中,如果需要,請?jiān)诘卿浄椒ㄖ姓{(diào)用該方法。降低方法的復(fù)雜度可簡化代碼的可維護(hù)性。
另外,在需要的地方重復(fù)使用您的方法,請勿將相同的代碼復(fù)制粘貼到不同的方法中。這導(dǎo)致代碼中不必要的重復(fù)和冗余。增加代碼行并不意味著您已經(jīng)編寫了不錯的代碼。重構(gòu)和優(yōu)化代碼是編寫穩(wěn)定,健壯和更好的自動化代碼的關(guān)鍵。
回收也是編寫更好的自動化代碼的另一個(gè)有用技巧。我有經(jīng)驗(yàn)豐富的人員可以自動化遺留系統(tǒng),不傾向于在自動化框架中更改現(xiàn)有方法,而不會在現(xiàn)有功能發(fā)生變化時(shí)重寫另一種方法。這只是使框架變得脆弱。每當(dāng)流程改變時(shí),總是要更新現(xiàn)有方法,盡管它有其自身的挑戰(zhàn),即新用戶可能不知道該方法可能具有的依賴性,但是我認(rèn)為我們應(yīng)該始終以長遠(yuǎn)的眼光來看待問題,而不是實(shí)現(xiàn)那些較短的目標(biāo)。 。
下面是一個(gè)示例,說明如何將登錄代碼簡化為一小部分功能,并使用了另一種注冊方法來簡化整個(gè)過程。
@Test
public void Register_User() throws InterruptedException
{
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
driver.get("https://www.lambdatest.com/ ");
driver.manage().window().maximize();
WebElement link= driver.findElement(By.xpath("http://a[text()='Free Sign Up']"));
link.click();
WebElement organization=driver.findElement(By.xpath("http://input[@name='organization']"));
organization.sendKeys("LambdaTest");
WebElement first_name=driver.findElement(By.xpath("http://input[@name='first_name']"));
first_name.sendKeys("Test");
WebElement last_name=driver.findElement(By.xpath("http://input[@name='last_name']"));
last_name.sendKeys("User");
WebElement email=driver.findElement(By.xpath("http://input[@name='email']"));
email.sendKeys("sadhvi.singh@navyuginfo.com");
WebElement password=driver.findElement(By.xpath("http://input[@name='password']"));
password.sendKeys("TestUser123");
WebElement phone_number=driver.findElement(By.xpath("http://input[@name='phone']"));
phone_number.sendKeys("9412262090");
WebElement button=driver.findElement(By.xpath("http://button[text()='SIGN UP']"));
button.click();
}
@Test
public void Login_User()
{
driver.get("https://accounts.lambdatest.com/login");
driver.findElement(By.xpath("http://input[@name='email']")).sendKeys("User2@gmail.com");
driver.findElement(By.xpath("http://input[@name='password']")).sendKeys("TestUser123");
driver.findElement(By.xpath("http://button[@class='sign-up-btn']")).click();
}
@AfterClass
public static void BrowserClose()
{
driver.quit();
}
}
3.合理地組織測試
好的,這確實(shí)是確保更好的自動化代碼的主要可操作見解之一。它不僅易于理解,而且在維護(hù)上無需花費(fèi)太多精力。從長遠(yuǎn)來看,借助框架來構(gòu)建測試可以增加工作價(jià)值,并減少維護(hù)工作。您可以通過使用由JUnit和TestNG之類的框架提供的注釋來控制應(yīng)用程序的流程。例如,使用@BeforeClass之類的注釋可以幫助您指導(dǎo)耗時(shí)的活動,例如連接到數(shù)據(jù)庫,設(shè)置瀏覽器等與此方法相關(guān)的代碼以及與此相關(guān)聯(lián)的@BeforeClass注釋。這可以幫助自動化測試儀立即知道該方法的確切功能以及何時(shí)調(diào)用該方法。試想一下,您的設(shè)置過程很清楚,并且已從代碼的其他部分中整理出來。
下面的示例突出顯示了通過TestNG框架展示了一種更好的結(jié)構(gòu)化方法:
import static org.junit.Assert.*;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
public class Lamdatest {
static WebDriver driver;
@BeforeClass
public static void BrowserOpen()
{
System.setProperty("webdriver.chrome.driver", "chromepath");
driver= new ChromeDriver() ;
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
}
@Test(priority=1)
public void Register_User() throws InterruptedException
{
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
driver.get("https://www.lambdatest.com/ ");
driver.manage().window().maximize();
WebElement link= driver.findElement(By.xpath("http://a[text()='Free Sign Up']"));
link.click();
WebElement organization=driver.findElement(By.xpath("http://input[@name='organization']"));
organization.sendKeys("LambdaTest");
WebElement first_name=driver.findElement(By.xpath("http://input[@name='first_name']"));
first_name.sendKeys("Test");
WebElement last_name=driver.findElement(By.xpath("http://input[@name='last_name']"));
last_name.sendKeys("User");
WebElement email=driver.findElement(By.xpath("http://input[@name='email']"));
email.sendKeys("sadhvi.singh@navyuginfo.com");
WebElement password=driver.findElement(By.xpath("http://input[@name='password']"));
password.sendKeys("TestUser123");
WebElement phone_number=driver.findElement(By.xpath("http://input[@name='phone']"));
phone_number.sendKeys("9412262090");
WebElement button=driver.findElement(By.xpath("http://button[text()='SIGN UP']"));
button.click();
String url= driver.getCurrentUrl();
assertEquals("fail- unable to register", url, "https://accounts.lambdatest.com/user/email-verification");
}
@Test(dependsOnMethods="Register_User")
public void Login_User()
{
driver.get("https://accounts.lambdatest.com/login");
driver.findElement(By.xpath("http://input[@name='email']")).sendKeys("User2@gmail.com");
driver.findElement(By.xpath("http://input[@name='password']")).sendKeys("TestUser123");
driver.findElement(By.xpath("http://button[@class='sign-up-btn']")).click();
}
@AfterClass
public static void BrowserClose()
{
driver.quit();
}
}
確定哪些注釋應(yīng)該與哪種測試方法相關(guān)聯(lián)是很重要的。通過明確的依賴關(guān)系和優(yōu)先級,可以根據(jù)應(yīng)用程序的流程來構(gòu)造測試和代碼。
4.全面驗(yàn)證您的測試
作為質(zhì)量檢查人員,您要做的就是驗(yàn)證您的預(yù)期和實(shí)際滿足情況,這與您的自動化代碼相同。如果您的腳本不符合驗(yàn)證要求,那么創(chuàng)建一個(gè)腳本將毫無意義,也沒有任何意義。理想情況下,每個(gè)用戶操作都應(yīng)該像測試用例步驟一樣進(jìn)行驗(yàn)證,無論它是在驗(yàn)證元素的可見性,還是要記住版式提示,文本表示形式,頁面重定向或任何形式的視覺驗(yàn)證,甚至是關(guān)于評估數(shù)據(jù)庫的結(jié)果。
即使您的驗(yàn)證無法確定,也會顯示失敗消息,以便您可以找出問題所在。我們在驗(yàn)證代碼方面犯的最大錯誤是從確保驗(yàn)證通過的角度編寫。我們從未考慮過如果代碼失敗或未達(dá)到預(yù)期效果會發(fā)生什么,那么繼續(xù)下去將需要什么。
如果您希望在驗(yàn)證失敗后立即中斷測試并跳至另一測試,則可以使用硬斷言,而如果您希望在同一頁面上驗(yàn)證多個(gè)檢查,則可以選擇軟斷言。決定完全使用哪個(gè)斷言取決于用例。
以下是在登錄頁面上執(zhí)行的斷言示例。在此方法中,將創(chuàng)建一種方法,其中使用有效憑據(jù)登錄用戶,然后使用另一種方法確保用戶不會使用無效憑據(jù)登錄并顯示錯誤消息。
//validate user able to login with valid credentials
@Test
public void Login_User() throws IOException
{
driver.get("https://accounts.lambdatest.com/login");
driver.findElement(By.xpath("http://input[@name='email']")).sendKeys("User2@gmail.com");
driver.findElement(By.xpath("http://input[@name='password']")).sendKeys("TetsUser123");
driver.findElement(By.xpath("http://button[@class='sign-up-btn']")).click();
WebDriverWait wait= new WebDriverWait(driver, 15);
wait.until(ExpectedConditions.visibilityOf(driver.findElement(By.xpath("http://a[@class='user-profile dropdown-toggle']"))));
String Current_url= driver.getCurrentUrl();
Assert.assertEquals("https://accounts.lambdatest.com/user/email-verification", Current_url);
System.out.println("user logged in sucesfully");
driver.findElement(By.xpath("http://a[@class='user-profile dropdown-toggle']")).click();
driver.findElement(By.xpath("http://a[contains(text(),'Logout')]")).click();
}
//validate user is unable to login with invalid credentials
@Test
public void Login_invalid_User() throws IOException
{
driver.get("https://accounts.lambdatest.com/login");
driver.findElement(By.xpath("http://input[@name='email']")).sendKeys("User21@gmail.com");
driver.findElement(By.xpath("http://input[@name='password']")).sendKeys("TestUser123");
driver.findElement(By.xpath("http://button[@class='sign-up-btn']")).click();
WebDriverWait wait= new WebDriverWait(driver, 15);
String str= driver.findElement(By.xpath("http://p[@class='error-mass']")).getText();
String Current_url= driver.getCurrentUrl();
Assert.assertEquals("https://accounts.lambdatest.com/login", Current_url);
System.out.println(str);
}
覆蓋多個(gè)驗(yàn)證檢查的方法可能有所不同,或者您可以像我上面所做的那樣為每個(gè)驗(yàn)證選擇不同的方法,或者可以選擇在try-catch塊下的單個(gè)方法中進(jìn)行所有驗(yàn)證。
5.sleep不能改善穩(wěn)定性
我們傾向于相信的最大神話,尤其是當(dāng)我們剛接觸自動化領(lǐng)域時(shí),是通過為腳本提供足夠的等待量,必要或不必要的等待會導(dǎo)致腳本順利執(zhí)行。相反,它使腳本不穩(wěn)定,并增加了總體執(zhí)行時(shí)間。這種靜態(tài)睡眠的主要問題是,我們不了解運(yùn)行測試的機(jī)器的負(fù)載,因此可能導(dǎo)致超時(shí)。因此,應(yīng)避免使用thread.sleep來維護(hù)更好的自動化代碼。對腳本使用等待的一種更好的方法是通過條件綁定,其中腳本可以像人類一樣等待直到滿足特定條件。例如,等待直到某個(gè)元素可見或不可見。
作為開發(fā)更好的自動化代碼的一種選擇,顯式和流暢的等待更加適應(yīng)。
6.進(jìn)行測試,數(shù)據(jù)驅(qū)動
在對多種形式的數(shù)據(jù)進(jìn)行測試時(shí),測試變得更加有效,當(dāng)編寫更好的自動化代碼以測試Web應(yīng)用程序或任何其他軟件時(shí),測試也是如此。在自動化中,關(guān)鍵是通過多種形式的數(shù)據(jù)測試測試代碼,而不是為每個(gè)數(shù)據(jù)編寫不同的測試腳本。這可以通過數(shù)據(jù)驅(qū)動的測試框架輕松實(shí)現(xiàn)。它有助于將測試數(shù)據(jù)輸入存儲到外部數(shù)據(jù)庫中,例如CSV文件,excel文件,文本文件,XML文件甚至是ODBC存儲庫。此數(shù)據(jù)被調(diào)用到腳本中,并一次又一次地運(yùn)行在相同的測試代碼中。與手動工作相比,這有助于減少冗余并加快執(zhí)行速度。發(fā)現(xiàn)新的bug。這種方法的另一個(gè)好處是,它減少了您可能必須添加的測試腳本的數(shù)量,從而加快了測試周期。
與之保持同步,它還有助于簡化腳本的可維護(hù)性。如果應(yīng)用程序發(fā)生任何更改,代碼中的所有硬編碼值都可能會中斷。實(shí)現(xiàn)此目的的一種更簡單的方法是將所有硬編碼組件設(shè)置為變量驅(qū)動。例如,通過將它們各自的值存儲在excel工作表中并在腳本中調(diào)用它們,可以使所有定位器都不受代碼限制。萬一您的任何定位器損壞了,您只需要在excel中更改定位器的值即可,而根本不需要觸摸腳本。
數(shù)據(jù)驅(qū)動測試的一個(gè)基本示例是:
public void Login_User() throws IOException
{
File f1= new File("C://Users//navyug//Desktop//Test.xlsx");
FileInputStream scr= new FileInputStream(f1);
XSSFWorkbook book= new XSSFWorkbook(scr);
XSSFSheet sheet=book.getSheetAt(0);
for(int i=0; i<=sheet.getLastRowNum(); i++ )
{
//XSSFCell cell= sheet.getRow(i).getCell(1);
Row row = sheet.getRow(i);
Cell cell = row.getCell(0);
driver.findElement(By.xpath("http://input[@name='email']")).sendKeys(cell.toString());
cell= row.getCell(1);
driver.findElement(By.xpath("http://input[@name='password']")).sendKeys(cell.toString());
driver.findElement(By.xpath("http://button[@class='sign-up-btn']")).click();
WebDriverWait wait= new WebDriverWait(driver, 15);
wait.until(ExpectedConditions.visibilityOf(driver.findElement(By.xpath("http://a[@class='user-profile dropdown-toggle']"))));
String Current_url= driver.getCurrentUrl();
Assert.assertEquals("https://accounts.lambdatest.com/user/email-verification", Current_url);
System.out.println("user logged in sucesfully");
takescreenshot();
driver.findElement(By.xpath("http://a[@class='user-profile dropdown-toggle']")).click();
driver.findElement(By.xpath("http://a[contains(text(),'Logout')]")).click();
}
}
上面的代碼顯示了從Excel獲取的用于不同登錄憑據(jù)的數(shù)據(jù)。對于Xpath也可以擴(kuò)展同樣的功能,其中XPath值也可以從excel中提取。在這里,通過數(shù)據(jù)驅(qū)動方法解決的關(guān)鍵點(diǎn)是從我們的代碼中刪除硬編碼的值,使其成為面向變量,并使其在多組輸入中運(yùn)行同一段代碼。
7.不要錯過報(bào)告!
如果自動化代碼沒有向您報(bào)告結(jié)果,則該代碼將無法正常工作。為了優(yōu)化您作為自動化工程師的工作,重要的是要知道哪些測試代碼通過了,哪些失敗并附帶了屏幕截圖。您可以向利益相關(guān)者展示的最佳投資回報(bào)是通過報(bào)告。共享這些詳細(xì)的報(bào)告可提供可見性,并減少您驗(yàn)證測試執(zhí)行腳本的時(shí)間。您可以通過TestNG HTML報(bào)告生成,JUnit報(bào)告生成等各種技術(shù)來實(shí)現(xiàn)報(bào)告,也可以使用擴(kuò)展庫來實(shí)現(xiàn)報(bào)告。
下面的代碼顯示了一個(gè)示例,其中登錄功能的完成后已截取了屏幕截圖作為驗(yàn)證通過的證明,而下面是執(zhí)行后生成的TestNG報(bào)告的示例:
//validate user able to login with valid credentials
@Test
public void Login_User() throws IOException
{
driver.get("https://accounts.lambdatest.com/login");
driver.findElement(By.xpath("http://input[@name='email']")).sendKeys("User2@gmail.com");
driver.findElement(By.xpath("http://input[@name='password']")).sendKeys("TetsUser123");
driver.findElement(By.xpath("http://button[@class='sign-up-btn']")).click();
WebDriverWait wait= new WebDriverWait(driver, 15);
wait.until(ExpectedConditions.visibilityOf(driver.findElement(By.xpath("http://a[@class='user-profile dropdown-toggle']"))));
String Current_url= driver.getCurrentUrl();
Assert.assertEquals("https://accounts.lambdatest.com/user/email-verification", Current_url);
System.out.println("user logged in sucesfully");
takescreenshot();
driver.findElement(By.xpath("http://a[@class='user-profile dropdown-toggle']")).click();
driver.findElement(By.xpath("http://a[contains(text(),'Logout')]")).click();
}
public void takescreenshot() throws IOException
{
TakesScreenshot scr= ((TakesScreenshot)driver);
File file1= scr.getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(file1, new File("C:\\Users\\navyug\\Desktop\\Login_user.PNG"));
}
8.不要忘記跨瀏覽器測試!
如今,所有Web應(yīng)用程序都支持多種瀏覽器和版本。重要的是,您的代碼應(yīng)針對多個(gè)瀏覽器,而不是針對特定的瀏覽器。在特定的瀏覽器上運(yùn)行代碼會失去應(yīng)用程序的跨瀏覽器兼容性。執(zhí)行跨瀏覽器測試,以確保您的應(yīng)用程序在所有主要瀏覽器上都能提供無縫的用戶體驗(yàn),我們可以擴(kuò)展此測試的自動化范圍。諸如TestNG之類的框架有助于輕松地在各種瀏覽器中執(zhí)行測試。
下面的代碼顯示了如何通過TestNG在多個(gè)瀏覽器上運(yùn)行自動化代碼
public class crowssbrowser {
static WebDriver driver;
@Parameters("browser")
@BeforeClass
public static void Browser_Select(String browser)
{
if(browser.equalsIgnoreCase("firefox")) {
System.setProperty("webdriver.firefox.marionette", "geckodriverpath");
driver = new FirefoxDriver();
// If browser is IE, then do this
}else if (browser.equalsIgnoreCase("chrome")) {
// Here I am setting up the path for my IEDriver
System.setProperty("webdriver.chrome.driver", "chromedriverpath");
driver= new ChromeDriver() ;
}
driver.get("https://accounts.lambdatest.com/login");
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}
XML代碼:
<?xml ve
rsion="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="none">
<test name="FirefoxTest">
<parameter name="browser" value="firefox" />
<classes>
<class name="crowssbrowser" />
</classes>
</test>
<test name="chrometest">
<parameter name="browser" value="chrome" />
<classes>
<class name="crowssbrowser" />
</classes>
</test>
</suite>
上面的代碼顯示了一種以瀏覽器為參數(shù)的方法,其中設(shè)置了不同的瀏覽器驅(qū)動程序。使用TestNG XML文件,我們已將參數(shù)傳遞為不同的瀏覽器,在這些瀏覽器上將運(yùn)行用于Firefox和chrome上的登錄功能的代碼。以上內(nèi)容就是本篇的全部內(nèi)容以上內(nèi)容希望對你有幫助,有被幫助到的朋友歡迎點(diǎn)贊,評論。
?如果文章對你有幫助,記得點(diǎn)贊,收藏,加關(guān)注。會不定期分享一些干貨哦......
最后感謝每一個(gè)認(rèn)真閱讀我文章的人,看著粉絲一路的上漲和關(guān)注,禮尚往來總是要有的,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走:
這些資料,對于想做【軟件測試】的朋友來說應(yīng)該是最全面最完整的備戰(zhàn)倉庫,這個(gè)倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你!凡事要趁早,特別是技術(shù)行業(yè),一定要提升技術(shù)功底。希望對大家有所幫助……加入我的學(xué)習(xí)交流群一起學(xué)習(xí)交流討論把?。。?!??文章來源:http://www.zghlxwxcb.cn/news/detail-406794.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-406794.html
到了這里,關(guān)于2023年,8種必備Selenium編寫自動化用例的技巧的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!