首页 » 虚拟系统 » 使用Selenium PowerShell在本地构建测试服务器

使用Selenium PowerShell在本地构建测试服务器

谷歌已收录,更新于2019年08月03日; 如遇到问题,请留言及时通知站长; 欢迎加入 三生三世,讨论各种问题!

说明

当您想要整体验证Web应用程序时,自动Web测试很有用。它不应该是您的测试金字塔的基础,因为Web测试很难开发和维护。在这篇文章中,我们将了解如何利用Selenium使用Selenium PowerShell模块以及Pester来开发测试框架。Selenium大量用于测试Universal Dashboard

环境部署

您需要的第一件事是安装Selenium PowerShell模块。该模块在PowerShell库中可用,因此您可以使用Install-Module将其置于本地。所以你只需在powershell中运行如下命令即可。

Install-Module Selenium

接下来,您将要选择要测试的浏览器(或浏览器)并确保它们已安装。您目前可以将ChromeInternet ExplorerFirefoxSelenium模块配合使用。要创建新的浏览器实例,您需要使用相应的cmdlet

$Driver = Start-SeChrome

cmdlet将创建浏览器的新Selenium Web驱动程序实例。运行此cmdlet后,您应该会看到一个Chrome窗口打开。您现在可以开始自动化了。

对于本文的其余部分,我们将使用Universal Dashboard创建一个网站,然后使用SeleniumPester进行测试。如果您想跟随,请随意通过图库安装模块。

Install-Module UniversalDashboard -AcceptLicense

页面导航

首先,让我们使用Universal Dashboard启动一个新的网站。这个网站只有一些标题文字,上面写着Hello,World

$Dashboard=New-UDDashboard-Title "Dashboard"-Content {New-UDHeading-Text "Hello, World"}
Start-UDDashboard -Dashboard $Dashboard -Port 1000 -Force

接下来,让我们让Chrome打开这个刚建立的网站。

Enter-SeUrl -Driver $Driver -Url "http://localhost:1000"

Chrome现在应该已经打开了Universal Dashboard的主页。

查找元素

在执行Web浏览器自动化时,您将面临的主要挑战之一是成功查找HTML文档中的元素。cmdlet Find-SeElement是导航到页面后定位元素的方式。您可以按标签ID类名CSS选择器名称链接文本部分链接文本xpath查找元素。

在进行浏览器自动化时,您可能会在浏览器中使用开发人员工具。如果右键单击网页中的元素,然后选择检查元素,您将进入开发人员工具,他们将提供有关该元素的各种信息。

按ID查找

接下来修改我们的网站,为我们的标题提供一个ID

$Dashboard = New-UDDashboard-Title "Dashboard"-Content { New-UDHeading-Text "Hello, World"-Id "Heading" }

这是HTML文档中查找元素的最简单,最快捷的方法之一。并非所有元素都具有ID,但如果您可以控制它并想要对页面进行测试,那么这是一个很好的方法。如果您没有为UD中的元素指定ID,它将使用随机GUID创建一个ID

$Element = Find-SeElement -Driver $Driver -Id 'Heading'

你会看到你现在有一个Selenium元素。元素是丰富的对象,提供各种属性和方法。

TypeName: OpenQA.Selenium.Remote.RemoteWebElement

Name MemberType Definition
---- ---------- ----------
Clear Method void Clear(), void IWebElement.Clear()
Click Method void Click(), void IWebElement.Click()
Equals Method bool Equals(System.Object obj)
FindElement Method OpenQA.Selenium.IWebElement FindElement(OpenQA.Selenium.By by), OpenQA.Selenium.IWebElement ISearchContext... 
FindElementByClassName Method OpenQA.Selenium.IWebElement FindElementByClassName(string className), OpenQA.Selenium.IWebElement IFindsBy... 
FindElementByCssSelector Method OpenQA.Selenium.IWebElement FindElementByCssSelector(string cssSelector), OpenQA.Selenium.IWebElement IFin...
FindElementById Method OpenQA.Selenium.IWebElement FindElementById(string id), OpenQA.Selenium.IWebElement IFindsById.FindElement... 
FindElementByLinkText Method OpenQA.Selenium.IWebElement FindElementByLinkText(string linkText), OpenQA.Selenium.IWebElement IFindsByLi...
FindElementByName Method OpenQA.Selenium.IWebElement FindElementByName(string name), OpenQA.Selenium.IWebElement IFindsByName.FindE...

按类名查找

CSS类名是在文档中定位元素的另一种方法。Find-SeElement可以返回多个元素。按类名选择很有可能做到这一点。例如,如果我们将页面修改为包含2DIV标记并且具有相同的类名,则Find-SeElement将返回两者。

New-UDElement-tag div -Attributes @{
   className='myClass'
}
New-UDElement-tag div -Attributes @{ 
   className='myClass'
}

要查找这些DIV,请使用Find-SeElementClassName参数。

$Element = Find-SeElement -Driver $Driver -ClassName 'myClass'
$Element | Measure-Object

Count : 2
Average : 
Sum : 
Maximum : 
Minimum : 
Property :

您不能使用此参数指定多个类名。

通过CSS Selector查找

CSS选择器允许您根据标签,类名或属性选择元素。您可以使用CSS参数通过CSS选择器查找元素。让我们修改我们的网站以获得文本输入控件并通过CSS选择器选择它。

New-UDElement-tag input -Attributes @{
   type="text"
}

要查找此输入控件,请使用以下CSS选择器。

Find-SeElement -Driver $Driver -Css 'input[type=text]'

按标签查找

您还可以根据标签查找元素。这对于查找网站中的所有图像等内容非常有用。让我们修改我们的网站,以获得一些图像。

New-UDImage-Url https://ironmansoftware.com/wp-content/uploads/2019/06/ironermanhead-1.png
New-UDImage-Url https://i0.wp.com/ironmansoftware.com/wp-content/uploads/2019/07/uddemo.png
New-UDImage-Url https://i1.wp.com/ironmansoftware.com/wp-content/uploads/2019/01/logo-1.png

要选择所有图像,请使用TagName参数。

Find-SeElement -Driver $Driver -TagName 'img'

按子类查找

到目前为止,我所展示的所有示例都是从根文档中查找元素并搜索整个文档的树。也可以找到特定元素的孩子。您可以使用Find-SeElementElement参数而不是Driver参数来执行此操作。

让我们更新我们的页面以创建嵌套列表并在列表中查找嵌套列表项。

New-UDElement-Tag ul -Id 'list'-Content {
   New-UDElement-Tag li -Content {"item1"}
   New-UDElement-Tag li -Content {"item2"}
   New-UDElement-Tag li -Content {"item3"}
   New-UDElement-Tag li -Content {"item4"}
}

要查找所有嵌套的li元素,我们可以使用Find-SeElement两次。首先我们找到列表,然后我们找到子类。

$Element = Find-SeElement -Driver $Driver -Id list
Find-SeElement -TagName li -Element $Element | Measure-Object

使用元素

一旦我们找到了元素,我们就会开始使用它们。对象本身具有许多属性和方法。以下是我经常使用的一些常见问题。

检索元素文本

访问元素的文本非常容易。这将包括元素本身的文本以及该元素的所有子元素。如果我们在我们的网站上有一个带有一些文本的div,就像这样。

New-UDElement -Tag div -Id 'text' -Content { "Some Text" }

然后我们可以找到该元素并像这样显示它的文本。

(Find-SeElement -Driver $Driver -Id text).Text

单击元素

为了与网站进行互动,需要在某个时间点击。要单击,您可以找到该元素,然后使用Invoke-SeClick cmdlet向该元素发出单击。让我们更新我们的网站,以便在点击时显示一个显示祝酒的按钮。

New-UDButton-Text "Click me!" -Id 'button' -OnClick {
   Show-UDToast-Message "I have been clicked!"
}

要单击此按钮,我们可以使用Find-SeElementInvoke-SeClick的组合。

Find-SeElement -Driver $Driver -Id button | Invoke-SeClick

有时,由于页面的状态,元素将隐藏在其他元素下面。发生这种情况时,默认的Invoke-SeClick不足以单击该元素。您可以通过提供Invoke-SeClickJavaScriptClick参数,通过JavaScript发出click事件。确保在以这种方式调用时包含驱动程序。

Find-SeElement -Driver $Driver -Id button | Invoke-SeClick -Driver $Driver -JavaScriptClick

发送文本内容

您可以使用Send-SeKeys命令将键击发送到文本框等元素。首先,让我们创建一个带文本框的网站。

New-UDTextbox-Id 'textbox'

现在我们可以将键击发送到该文本框。

$Element = Find-SeElement -Driver $Driver -Id textbox
Send-SeKeys -Element $Element -Keys "Hello, there!"

您将特殊键击发送到文本框,您应该使用Selenium Keys枚举。例如,如果我们想要发送一个回车键,你就可以这样做。

$Element = Find-SeElement -Driver $Driver -Id textbox
Send-SeKeys -Element $Element -Keys ([OpenQA.Selenium.Keys]::Enter)

等待元素出现

使用动态网站时,通常需要等待一段时间才能在页面上显示元素。默认情况下,Selenium不会等待,您将从Find-SeElement收到$null,因为该元素尚未存在。有几种方法可以解决这个问题。

第一种是使用Wait-SeElementExists cmdlet等待文档中元素的存在。让我们创建一个有按钮的网站,当您点击它时,它会向页面添加一个新元素。

New-UDButton-Text 'Add an element'-Id 'add'-OnClick {
    Add-UDElement-ParentId 'parent'-Content {
        New-UDElement-Tag 'div'-Id 'child'
    }
}
New-UDElement-Tag 'div'-Id 'parent'

为了测试此功能,我们需要单击按钮,然后测试子元素是否存在。这可能需要几毫秒才能发生,所以我们需要在脚本中加入一些等待功能。下面的代码片段将等待2秒钟。如果元素在超时之前没有出现,则会引发错误。如果在2秒之前找到该元素,则Wait-SeElementExists将返回该元素。

Find-SeElement -Driver $Driver -Id add | Invoke-SeClick
Wait-SeElementExists -Driver $Driver -Id 'child' -Timeout 2

您还可以为Find-SeElement的所有调用启用默认等待期。这意味着任何对Find-SeElement的调用都会在抛出错误之前等待默认超时。这可以在驱动程序本身上配置。

$Driver=Start-SeChrome
$Driver.Manage().Timeouts().ImplicitWait = [TimeSpan]::FromSeconds(10)

与Pester整合

如前所述,Universal Dashboard广泛使用Selenium来测试框架。以下是我在使用SeleniumPester时学到的一些提示和技巧。以下是Universal Dashboard存储库中的示例测试。

测试框架整合

Describe "New-UDButton" {
   Context "Text" {
     Set-TestDashboard {
        New-UDButton-Text "Click Me"-Id "button"
     }
     It "has text" {
         (Find-SeElement-Driver $Driver-Id "button").Text | should be "Click Me"
     }
   }
}

避免打开和关闭浏览器

硒测试可能很慢。当您打开和关闭浏览器时,这就变得更加严重。我不是按照描述或每个上下文打开浏览器,而是在测试会话开始时打开浏览器(在某些情况下,这在大多数情况下都不起作用)。

每当我需要开始新的测试时,我只需创建一个新的Universal Dashboard实例并使用Selenium模块的Enter-SeUrl cmdlet导航到它。

$Server.DashboardService.SetDashboard($Dashboard)
Enter-SeUrl-Url "http://localhost:10001"-Driver $Driver

偏好ID元素位置

按ID查找元素是有利的,因为它通常只产生一个元素。你将永远得到你想要的东西。如果可能,尝试尽可能地识别元素。CSS选择器也非常有用,因为它们可以极大地缩小可能的元素范围。按标签名称查找大量元素可能会很慢。

为元素位置设置隐式超时

我发现设置一个隐式超时使得测试更容易准备,并且我的测试的可靠性提高了,因为我不必记得在编写测试时等待元素存在。在您的工作站上运行测试的方式与在CI管道中运行的方式之间通常存在很大差异。确保您有更长的隐式超时确实有帮助。

利用Wait-Debugger暂停测试

这可能是一个更通用的测试技巧,但在编写这些Web自动化测试时会利用Wait-Debugger命令。通常,设置网站需要一段时间,尝试检查元素,停止测试,尝试更新测试并再次运行测试以发现需要再次检查元素可能会很繁琐。相反,在测试的网站设置结束时抛出Wait-Debugger。它为您提供了直接使用Selenium对象的绝佳机会,让您的测试编写时间更短。

后续说明

一旦掌握了它,Web浏览器自动化实际上非常简单。希望Selenium PowerShell模块更容易实现。如果您想回馈Selenium PowerShell模块,请随意在GitHub上分叉。如果您想了解我如何在Universal Dashboard中使用它,请点击查看GitHub存储库

一个只会魔改主题,而不会制作主题的站长,专业扒各种网站的各种样式。希望每一位来到这里的访客,都能拿到你们需要的资源!

发表评论

已有 4 条评论

  1. Eltrac Eltrac说道:

    好久没来看黑冰大佬惹

    1. 枂下 枂下说道:

      我想把你评论全删掉

  2. 七越 七越说道:

    博客惨淡 无人问津 来看看黑冰大佬寻求温暖

    1. 枂下 枂下说道:

      没有求温暖,惨淡倒是真的。

最近动态查看

    利用短代码实现了文章正文任意位置插入[googleads],前端自动变为谷歌广告。这样,文章过长时,可以随意插入广告了。
返回主页看更多
赏杯咖啡给站长 支付宝 扫一扫