硒等待:内隐,外显,流利和睡眠

Selenium等待页面加载在Selenium脚本中起着重要的作用。 它们有助于使它们不易剥落,更可靠。 Selenium提供多次等待,以根据某些条件在脚本执行中提供足够的等待或暂停。 从而确保您在使用Selenium执行自动化测试时不会导致脚本失败。 在本教程中,我们将解释Selenium等待和睡眠的类型,并提供实时示例以及对它们的比较研究。 让我们首先回答一个关键问题:“为什么要使用硒等待?”

为什么我们需要硒等待?

大多数现代应用程序的前端都是基于JavaScript或Ajax构建的,使用诸如React,Angular之类的框架,或任何其他需要花费一定时间才能在页面上加载或刷新Web元素的框架。 因此,如果您倾向于在脚本中找到尚未加载到页面上的元素,则selenium会向您抛出“ ElementNotVisibleException ”消息。

下面的代码段将帮助您展示与使用Selenium执行自动化测试时相同的问题。 在此代码段中,我使用的是easymytrip.com的示例,在该示例中,post用户选择行程日期的“ From”和“ To”目的地,Web应用程序需要花费一些时间来加载所需的航班详细信息。 在这种情况下,用户无需等待就可以从列表中预订第一个航班。 现在,由于页面尚未加载,脚本无法找到“立即预订”按钮。 结果抛出“ NoSuchElementException ”。 下面的代码段和控制台输出:

 import java.util.concurrent.TimeUnit;   import org.openqa.selenium.By;  import org.openqa.selenium.JavascriptExecutor;  import org.openqa.selenium.Keys;  import org.openqa.selenium.WebDriver;  import org.openqa.selenium.chrome.ChromeDriver;   import com.gargoylesoftware.htmlunit.javascript.background.JavaScriptExecutor;   public class NoWaitImplemented {  public static void main(String[] args) throws InterruptedException {         System.setProperty( "webdriver.chrome.driver" , ".\\Driver\\chromedriver.exe" );         WebDriver driver= new ChromeDriver();         driver.manage().window().maximize();                 driver.get( " https://www.easemytrip.com/ " );         driver.findElement(By.id( "FromSector_show" )).sendKeys( "Delhi" , Keys.ENTER); driver.findElement(By.id( "Editbox13_show" )).sendKeys( "Mumbai" , Keys.ENTER); driver.findElement(By.id( "ddate" )).click(); driver.findElement(By.id( "snd_4_08/08/2019" )).click(); driver.findElement(By.className( "src_btn" )).click(); driver.findElement(By.xpath( "//button[text()='Book Now']" )).click();                              }   } 

控制台输出:

我已经使用XPath通过脚本对Selenium进行自动化测试来定位Web元素。

:带有示例的在硒中使用XPath的完整指南

Selenium等待页面加载有助于解决此问题。 Selenium等待有不同类型,例如隐式等待和显式等待,可确保在Selenium脚本发现元素之前,将元素加载到页面中以进行进一步的操作。

硒类型等待页面加载

在使用Selenium执行自动化测试时,在生成Selenium脚本时,我们使用以下类型的等待:

  • Thread.Sleep()方法
  • 隐式等待
  • 显式等待
  • 流利的等待

让我们深入了解其中的每一个。

Thread.Sleep()用于使用硒进行自动化测试

Sleep是属于线程类的静态方法。 可以使用类名(即Thread)的引用来调用此方法。 如果在使用Selenium执行自动化测试时使用Thread.sleep ,则此方法将在指定的持续时间内停止执行脚本,而不管是否在网页上找到了该元素。 它接受持续时间(以毫秒为单位)。 相同的语法是:

Thread.sleep(3000);

睡眠函数抛出InterruptedException,因此应使用try-catch块进行处理,如下所示:

 try {  Thread.sleep( 5000 );  }  catch (InterruptedException ie){  } 

为什么使用Thread.Sleep()不是一个好主意?

现在,我将重点介绍使用thread.sleep()的一些缺点。

  • Selenium Webdriver等待指定的时间,无论是否找到元素。 如果在指定的持续时间之前找到元素,脚本将仍然等待该持续时间,从而增加了脚本的执行时间。
  • 如果要显示的元素在静态时间后没有出现并保持更改,那么您将永远不会知道睡眠功能所需的估计时间。 如果花费的时间超过了定义的时间,脚本将抛出错误。 这就是为什么,如果您正在使用Selenium等待处理动态元素,那么最好不要使用Thread.sleep()。
  • Thread.sleep仅适用于之前编写的元素。 如果您有两到四个元素需要等待一定的时间才能加载,则在这种情况下,需要多次指定Thread.sleep。 如果这样做的话! 好的,您到处都会发现脚本充满了Thread.sleep()语法。

由于上述缺点,在脚本创建中使用Thread.Sleep()被认为是一种不好的做法。

下面的代码片段突出显示了Thread.Sleep()在Selenium自动化测试中的用法。 在此示例中,我们使用与上面的easymytrip相同的示例,在该示例中,一旦用户单击搜索,我们将停止线程执行。 在这种情况下,代码可以正常工作,而不会引发任何错误。

 import java.util.concurrent.TimeUnit;   import org.openqa.selenium.By;  import org.openqa.selenium.JavascriptExecutor;  import org.openqa.selenium.Keys;  import org.openqa.selenium.WebDriver;  import org.openqa.selenium.chrome.ChromeDriver;   import com.gargoylesoftware.htmlunit.javascript.background.JavaScriptExecutor;   public class ThreadWait {  public static void main(String[] args) throws InterruptedException { // TODO Auto-generated method stub         //setting the driver executable System.setProperty( "webdriver.chrome.driver" , ".\\Driver\\chromedriver.exe" );         //Initiating your chromedriver WebDriver driver= new ChromeDriver();         driver.manage().window().maximize();                 driver.get( " https://www.easemytrip.com/ " );         driver.findElement(By.id( "FromSector_show" )).sendKeys( "Delhi" , Keys.ENTER); driver.findElement(By.id( "Editbox13_show" )).sendKeys( "Mumbai" , Keys.ENTER); driver.findElement(By.id( "ddate" )).click(); driver.findElement(By.id( "snd_4_08/08/2019" )).click(); driver.findElement(By.className( "src_btn" )).click(); Thread.sleep( 5000 ); driver.findElement(By.xpath( "//button[text()='Book Now']" )).click();                                  }   } 

现在,如果我有同一应用程序的另一个页面需要花费一些时间来加载,该怎么办? 在这种情况下,我不想在脚本中多次使用thread.sleep()。

您可能会认为,如果不是Thread.sleep(),那么哪个Selenium等待页面加载就足以满足测试要求?

在这种情况下,这就是隐式等待的地方。 让我们详细检查隐式硒。

硒隐式等待自动化测试

Selenium解决了Thread.sleep()提供的问题,并提出了两个Selenium等待页面加载的方法。 其中之一是隐式等待,它允许您将WebDriver暂停特定的时间,直到WebDriver在网页上找到所需的元素为止。

这里要注意的关键点是,与Thread.sleep()不同,它不等待整个时间段。 如果在指定的持续时间之前找到了元素,它将继续执行代码的下一行,从而减少了脚本执行的时间。 这就是为什么隐式等待也称为动态等待的原因。 如果未在指定的持续时间内找到该元素,则抛出ElementNotVisibleException

关于隐式等待的另一件值得注意的事情是,它是全局应用的,这使其比Thread.sleep()更好。 这意味着您只需编写一次即可,它适用于整个WebDriver实例中脚本上指定的所有Web元素。 方便吗? 实现相同的语法是:

 driver.manage().timeouts().implicitlyWait(Time Interval to wait for , TimeUnit.SECONDS); 

隐式等待的默认时间为零,并且每隔500毫秒会不断轮询所需的元素。 让我们看下面的代码片段,展示隐式等待的用法。 在此示例中,我使用相同的easymytrip示例。 在这种情况下,我们将向前迈进并继续进行预订过程,在此过程中页面需要花费更多的时间来加载。 这里有两个页面存在页面加载问题,我们正在使用隐式等待而不是多次使用Thread.sleep()来处理一行代码。

 import java.util.concurrent.TimeUnit;   import org.openqa.selenium.By;  import org.openqa.selenium.JavascriptExecutor;  import org.openqa.selenium.Keys;  import org.openqa.selenium.WebDriver;  import org.openqa.selenium.WebElement;  import org.openqa.selenium.chrome.ChromeDriver;  import org.openqa.selenium.support.ui.Select;   import com.gargoylesoftware.htmlunit.javascript.background.JavaScriptExecutor;   public class ImplicitWait {  public static void main(String[] args) throws InterruptedException { // TODO Auto-generated method stub         //setting the driver executable System.setProperty( "webdriver.chrome.driver" , ".\\Driver\\chromedriver.exe" );         //Initiating your chromedriver WebDriver driver= new ChromeDriver();         driver.manage().window().maximize();         driver.manage().timeouts().implicitlyWait( 30 , TimeUnit.SECONDS); driver.get( " https://www.easemytrip.com/ " );         driver.findElement(By.id( "FromSector_show" )).sendKeys( "Delhi" , Keys.ENTER); driver.findElement(By.id( "Editbox13_show" )).sendKeys( "Mumbai" , Keys.ENTER); driver.findElement(By.id( "ddate" )).click(); driver.findElement(By.id( "snd_4_08/08/2019" )).click(); driver.findElement(By.className( "src_btn" )).click();  driver.findElement(By.xpath( "//button[text()='Book Now']" )).click();         JavascriptExecutor jse = (JavascriptExecutor)driver; jse.executeScript( "window.scrollBy(0,750)" );         driver.findElement(By.xpath( "//input[@type='email']" )).sendKeys( "sadhvisingh9049@gmail.com" );         driver.findElement(By.xpath( "//span[text()='Continue Booking']" )).click();         WebElement title=driver.findElement(By.id( "titleAdult0" ));         Select titleTraveller= new Select(title);         titleTraveller.selectByVisibleText( "MS" ); driver.findElement(By.xpath( "//input[@placeholder='Enter First Name']" )).sendKeys( "Sadhvi" ); driver.findElement(By.xpath( "//input[@placeholder='Enter Last Name']" )).sendKeys( "Singh" );         driver.findElement(By.xpath( "//input[@placeholder='Mobile Number']" )).sendKeys( "9958468819" );         driver.findElement(By.xpath( "//div[@class='con1']/span[@class='co1']" )).click();          }   } 

现在,我们知道了一个事实,即应该在一定的持续时间内加载页面,但是如果我们不知道该元素在加载时是可见/可点击的,该怎么办。 正如它出现的时候一样,它是动态的,并且会不断变化。 在这种情况下,显式等待将帮助您克服此问题。 让我们研究它的细节。

明确等待使用Selenium进行自动化测试

显式等待是动态Selenium等待的另一种。 显式等待帮助可在特定时间段内根据特定条件停止脚本的执行。 时间到头后,您将获得ElementNotVisibleException 。 在您不知道要等待的时间的情况下,此显式等待会派上用场。 使用elementToBeClickable()textToBePresentInElement()之类的条件 ,可以等待指定的持续时间。 可以结合使用WebDriverWait和ExpectedConditions类来使用这些预定义的方法。 为了使用这种情况,请在您的课程中导入以下软件包:

 import org.openqa.selenium.support.ui.ExpectedConditions  import org.openqa.selenium.support.ui.WebDriverWait 

发布该代码后,需要为WebDriverWait类创建一个引用变量,并使用WebDriver实例实例化该变量,并提供可能需要的Selenium等待页面加载的数量。 时间单位是秒。 可以如下定义它:

 WebDriverWait wait = new WebDriverWait(driver, 30 ); 

为了使用ExpectedCondition类的预定义方法,我们将使用如下的wait引用变量:

 wait.until(ExpectedConditions.visibilityOfElementLocated(Reference of Element to be  located using locator)); 

预期条件的类型:

以下是在使用Selenium执行自动化测试时通常使用的几种预期条件。

  • visibleOfElementLocated()-验证给定元素是否存在
  • alertIsPresent()-验证是否存在警报。
  • elementToBeClickable()-验证给定元素是否在屏幕上存在/可单击
  • textToBePresentInElement()-验证给定元素是否具有必需的文本
  • titlels()-验证条件,等待具有给定标题的页面

还有更多可用的预期条件,您可以通过Selenium官方GitHub页面进行引用。 像隐式等待一样,显式等待也会在每500毫秒后继续轮询。

以下是突出显示显式Selenium等待的用法的代码段。 在此示例中,我们使用的是“ rentomojo”应用程序,其中的模式在动态时间显示在主页上。 使用显式等待,基于元素的可见性,我们将等待元素并关闭弹出窗口。 参考代码:

 import java.util.concurrent.TimeUnit;   import org.openqa.selenium.By;  import org.openqa.selenium.JavascriptExecutor;  import org.openqa.selenium.WebDriver;  import org.openqa.selenium.chrome.ChromeDriver;  import org.openqa.selenium.support.ui.ExpectedConditions;  import org.openqa.selenium.support.ui.WebDriverWait;   public class ExplicitWait {  public static void main(String[] args) { // TODO Auto-generated method stub         //setting the driver executable System.setProperty( "webdriver.chrome.driver" , ".\\Driver\\chromedriver.exe" );                 //Initiating your chromedriver WebDriver driver= new ChromeDriver();                                                 driver.manage().window().maximize();                 driver.get( " https://www.rentomojo.com/ " );                 driver.findElement(By.xpath( "//span[@class='rm-city__selectorBoxLoca'][contains(text(),'Delhi')]" )).click();                                                 WebDriverWait wait= new WebDriverWait(driver, 120 );                                 wait.until(ExpectedConditions.visibilityOf(driver.findElement(By.xpath( "//div[@class='Campaign__innerWrapper']/button" )))); driver.findElement(By.xpath( "//div[@class='Campaign__innerWrapper']/button" )).click();  }   } 

注意-当同时使用隐式等待和显式等待时,它们将在累积时间上工作,而不是在单个等待条件下工作。 例如,如果给定隐式等待30秒,给定显式等待10秒,那么它正在寻找的显式元素将等待40秒。

硒等待之间的区别:显式与隐式

现在,由于您已经知道隐式等待和显式等待的用法,因此让我们研究一下这两个Selenium等待之间的区别:

隐式等待

显式等待

默认情况下,它将应用于脚本中的所有元素。 它仅适用于特定条件的特定元素。
我们不能根据指定条件(例如元素选择/可点击)而不是显式地等待。 明确地说,我们可以根据特定条件指定等待时间。
当您确定该元素在特定时间内可能可见时,通常使用它 当您不知道元素可见性的时间时,通常使用它。 它具有动态性质。

Fluent等待使用Selenium进行自动化测试

就其功能而言,Fluent等待类似于显式等待。 在Fluent等待中,当您不知道某个元素可见或单击所需的时间时,将对它执行Selenium等待。 Fluent等待提供的一些差异因素是:

  • 轮询频率-在显式等待的情况下,默认情况下此轮询频率为500毫秒。 使用Fluent wait,您可以根据需要更改此轮询频率,即,您可以告诉脚本在每个“ x”秒之后继续检查元素。
  • 忽略异常-在轮询期间,如果找不到元素,则可以忽略任何异常,例如'NoSuchElement'异常等。

除了这些差异因素(例如显式等待或隐式等待)之外,您还可以定义等待元素可见或可操作的时间。 以下语法或代码行用于定义Selenium中的Fluent等待:

默认情况下,它将应用于脚本中的所有元素。

语法似乎很复杂,但是一旦开始使用,它可能会变得很方便。 可能这是测试人员选择进行显式等待而不是进行Fluent等待的最大原因之一。 另外,Explicit等待和Fluent等待之间的主要区别在于Explicit Selenium Wait提供了预定义的条件,这些条件适用于我们需要等待的元素,而对于Fluent Selenium等待,则可以定义自己的自定义条件适用方法中的条件。

我对Fluent Selenium Wait的看法?

我个人还没有在实时示例中找到任何有用的流畅等待的实现,因此到目前为止,我希望自己不要执行它。 我和您一样渴望推出Selenium 4 。 我希望在发布之后,我们可以对使用Fluent等待而不是其他Selenium等待的实际优势有更多的了解。 到目前为止,根据我的经验,由于它比Fluent Selenium wait更容易实现代码,因此我倾向于使用Explicit Selenium wait。 如果您有其他意见,请在下面的评论中告诉我。

硒的角色等待基于云的硒网格

大多数测试人员通常更喜欢使用基于云的服务提供商进行Selenium测试的自动化网站测试 ,例如LambdaTest(云上的跨浏览器测试工具)。 想知道为什么吗?

那么,如果您在基于云的Selenium网格(例如LambdaTest)上运行自动化脚本 ,会发生什么呢? 硒等待如何有助于有效的测试结果?

每个基于云的提供程序都会在抛出Selenium超时异常之前提供默认的时间限制。 这样做是为了防止过度利用云资源。 在LamdaTest中,默认超时为90秒。 现在,如果您对Web元素的加载时间超过90秒,那该怎么办?

这就是硒等待的地方。 如果您的测试套件很复杂,可能会在云Selenium Grid上面临超时问题,那么您可以使用Selenium wait将WebDriver暂停默认时间超过90秒。 因此,避免在成功运行自动化脚本时发生超时错误。

硒的最终裁决正在等待中!

Selenium Waits可以帮助您减少脚本的脆弱性和可靠性。 无论选择哪种等待方式,都要确保它能帮助您实现Selenium自动化测试背后的目标。 另一要注意的关键是要确保在应用程序中不保留不必要的Selenium等待。 Thread.sleep()过去可能是一个选项,但是现在我们有新的Selenium等待和即将来临,我宁愿建议您远离Thread.sleep()来推动Selenium自动化测试。 因此,下一次您遇到了元素或页面加载问题时,便知道在哪里寻找。 测试愉快!

翻译自: https://www.javacodegeeks.com/2019/08/selenium-waits-implicit-explicit-fluent-sleep.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/341322.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python多个变量的for循环

当for循环有两个需要迭代的对象时,要用zip对这多个变量封装,否则会报错“too many values to unpack” 错误的例子: starts [0,1,2,3,4]ends [5,6,7,8,9]for start, end in starts, ends:print((start, end)) 正确的例子: sta…

1040 有几个PAT(PAT乙级 C++)

题目 字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P),第 4 位(A),第 6 位(T);第二个 PAT 是第 3 位(P),第 4 位(A),第 6 位(T)。 现给定字符串,问一…

在win10+Ubuntu双系统下,完美卸载Ubuntu

本文为转载博客,亲测有效 背景 机器:惠普 暗影精灵3 win10与Ubuntu16.04均为UEFI分区 清除ubuntu系统 使用软件:diskgenius   删除Ubuntu系统使用的几个分区(包括EFI分区),注意不要删除Windows的EFI分…

1048 数字加密(PAT乙级 C++)

题目 本题要求实现一种数字加密方法。首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余——这里用 J 代表 10、Q 代表 11、K 代表 12&…

在浏览器中在线尝试无服务器框架项目!

无服务器框架是无服务器工具的一致领导者。 但是,没有简单的方法可以在线试用无服务器框架项目。 您确实需要一个体面的开发人员设置,并且需要一些工作来设置sls , npm等。 确切地说,您做到了 –直到现在。 无服务器项目–在您的…

Dev C++源代码未编译

从DevC官网下载的编译器,结果编译程序没问题,但是运行程序时显示源文件未编译。 尝试很多方法。(官网下载不一定最佳)最后通过在其他网站下载重装DevC问题得以解决。 后一个DevC下载网址: https://pc.qq.com/detail/1…

1051 复数乘法(PAT乙级 C++)

题目 复数可以写成 (ABi) 的常规形式,其中 A 是实部,B 是虚部,i 是虚数单位,满足 i​2​​ −1;也可以写成极坐标下的指数形式 (Re​(Pi)),其中 R 是复数模,P 是辐角,i 是虚数单位&…

java se/ee_嗨,您好 。 。 ! 您如何评价Java / Java EE技能?

java se/ee要知道,就是要知道你一无所知。 那就是真正知识的含义。 苏格拉底 这篇文章旨在为读者提供Java生态系统及其技术堆栈的快速概述。 老实说,从Java EE 7,Java SE 8到Java Embedded 8…,Java平台进行了许多革命性的更改…

SystemC在Ubuntu16.04上安装测试

使用SystemC进行硬件仿真 环境 linux-x86-64bashg 下载解压SystemC SystemC下载地址 解压下载的包 tar zxvf systemc-2.3.3.tar.gz 进入解压出来的目录,准备编译安装 cd systemc-2.3.3 编译安装 打开安装说明文件INSTALL vim INSTALL 按照步骤安装 Create a tem…

1053 住房空置率(PAT乙级 C++ 坑点分析)

题目 在不打扰居民的前提下,统计住房空置率的一种方法是根据每户用电量的连续变化规律进行判断。判断方法如下: 在观察期内,若存在超过一半的日子用电量低于某给定的阈值 e,则该住房为“可能空置”;若观察期超过某给…

Java:从Java 8开始受益于内联类属性

希望在几年内,Java将具有“内联类”功能,该功能可以解决Java当前状态下的许多挑战。 阅读本文并学习如何立即使用Java 8或更高版本,并且仍将受益于即将出现的内联对象数组的一些优点,例如; 没有间接指针,消…

1054 求平均值(PAT乙级 C++)

题目 本题的基本要求非常简单:给定 N 个实数,计算它们的平均值。但复杂的是有些输入数据可能是非法的。一个“合法”的输入是 [−1000,1000] 区间内的实数,并且最多精确到小数点后 2 位。当你计算平均值的时候,不能把那些非法的数…

ubuntu16.04下安装ibus拼音

按照网上给的安装方法,没成功,在切换ibus的时候总是报错,记录下解决办法。 安装语言包 System Settings–>Language Support–>Install/Remove Languages 选中chinese,点击Apply应用即可,等待下载安装完成。 …

1057 数零壹(PAT乙级 C++实现)

题目 给定一串长度不超过 10​5 的字符串,本题要求你将其中所有英文字母的序号(字母 a-z 对应序号 1-26,不分大小写)相加,得到整数 N,然后再分析一下 N 的二进制表示中有多少 0、多少 1。例如给定字符串 P…

解决Ubuntu中sublime无法输入中文的问题

主要目的: 安装 Sublime Text 3 安装 Fcitx 输入法 皮肤 修复 Sublime Text 3 在 Ubuntu(Debian) 系统下的无法输入中文(CJK 字符)输入法的问题 注意: 这个修复仅当在终端中使用 subl . 调用 Sublime Text 的时有效, 具体原因请看源代码src/s…

java编程访问hdfs_以编程方式访问Java基本类型的大小

java编程访问hdfs许多不熟悉Java的开发人员首先要了解的一件事是Java的基本原始数据类型 ,其固定(与平台无关)的大小(以位或字节为单位用二进制补码表示 )以及它们的范围(Java中所有数字类型都是带符号的&a…

1059 C语言竞赛(PAT乙级 C++)

题目 C 语言竞赛是浙江大学计算机学院主持的一个欢乐的竞赛。既然竞赛主旨是为了好玩,颁奖规则也就制定得很滑稽: 0、冠军将赢得一份“神秘大奖”(比如很巨大的一本学生研究论文集……)。1、排名为素数的学生将赢得最好的奖品 —…

【Ubuntu】Ubuntu16.04安装 搜狗输入法 史上最详细

一、基本配置 开发环境:ubuntu16.04 二、准备工作 下载 搜狗输入法linux版 搜狗输入法官网Linux版 我这里是64位的,所以选择64位 1、拷贝搜狗输入法到ubuntu cp /media/sf_share/6q/sogoupinyin_2.3.1.0112_amd64.deb . 2、安装搜狗输入法 首次安装会报…

Spring Boot和Hibernate:打印查询和变量

办公室已经很晚了,您陷入了这个带有JoinColumns和层叠的奇怪的Jpa代码中,而您找不到错误所在。 您希望有一种方法可以查看打印的查询以及值。 稍微调整一下Spring Boot应用程序就可以实现。 借助lombock,这是我们的jpa模型。 package com.g…

解决SSH登录无响应timed out问题

输入 ssh usernamexx.xx.xx.xx光标一直闪烁,直到提示连接超时timed out。 这是因为服务器端的防火墙禁用了ssh服务的端口,默认为22. 有两种解决方法: 1)直接禁用防火墙 2)只开启22号端口 以Ubuntu为例: 1&…