硒的工作原理:第1-2集

在Java QA Engineer课程开始之前,准备了本文的翻译



第1集-交通


于2020年1月的最后一个周末进行了对话,该对话专门讨论了Selenium中的一个问题,有人回答说“为什么你不这样做……”,我决定写一系列文章解释这些命令在Selenium WebDriver上,以及为什么我们最终完成了今天的设计。

我将在本系列的每一集中重复这一步骤-有时,甚至有些疯狂,在Selenium的每个最小细节中都投入了很多想法。

为什么?

偶然的机会以及他做自己打算做的事情的好坏,硒被全世界成千上万的人使用。从小型初创公司到微软和谷歌,这是最广泛的公司如何确保其站点在每种浏览器中都能正常工作的方式。

Selenium ?


在Selenium的多年中,我们最终专注于使用HTTP作为与浏览器进行交互的方式。我们创建了REST-ish API(按照REST的精神,称为REST-ish),该API可使用每个客户端绑定并希望获得相同的结果。

HTTP和REST式的?认真吗

是的...

让我们从HTTP部分开始。刚开始时,我们必须基于每种浏览器的最佳方法来支持与每种浏览器进行交互的不同方式。例如,对于Internet Explorer,我们编写了COM代码。他工作得很好,但是从他那里我们仍然有噩梦。对于Firefox,我们编写了逐行阅读的怪物,幸运的是,由于Mozilla的“使您的浏览器”方法,它可以提供很多功能。 Opera允许我们通过DevTools协议进入。

因此,这意味着,特别是在WebDriver的早期,我们需要支持N:M绑定,其中N是语言绑定,M是我们支持的浏览器。这条路不会带来好的产品。我们决定需要一种每种语言都可以理解的东西。我们还需要一些可靠的东西。所以选择落在HTTP上,我们开始创建JSONWireProtocol

在框架中,JSONWireProtocol我们构建了一个REST-ish接口,该接口以JSON进行通信。我之所以说REST-ish是因为它并不完全遵循REST的所有原理,而是将它们体现到足以使其成为执行任务的强大工具的程度。

那么目前的状况如何呢?

网络,互联网和世界在不断发展。那么为什么硒不是呢?

这是一个很好的问题,但事实是我们正在努力实现现代化。不幸的是,如果网络不运行,则其网络状态为不工作。 HTTP作为协议非常可靠。它还使人们可以创建用于测试的群集,而不必担心多路复用的工作方式。这就是创建Selenium Grid的原因,当使用多台设备和计算机组织测试时,Selenium Grid仍然是一个不错的选择。

但它看起来更像是一个网络。

所以...有一些工具使用其Chrome调试协议来控制Chrome。他们在某些方面做得比Selenium更好,这是他们选择如何与浏览器进行通信的结果。不幸的是,这是Chrome的专有协议,因此其他浏览器可以访问它并不符合Google的利益。

此外,由于忽略了Google团队提供的有趣的设计解决方案,因此存在一个问题,我们必须保持不断开放的联系。在这种情况下,它使用WebSockets,但是您应该回想起我上面的评论,即只有在Internet可用之前,Internet才可用。 WebSockets将不断重新连接。还有一个问题是,该通道上上下会有多少流量。

当您仅与本地计算机上的内容进行交互时,但是如果您在您之间集成了诸如Circle CI或TravisCI之类的CI服务以及诸如AWS Device Farm,Sauce Labs或BrowserStack之类的CI服务,则对p人来说这不是问题然后您的跑步者突然进入Internet,并且该数据应该到达接收者。

由浏览器供应商和Selenium成员组成的W3C浏览器测试和工具工作组正在尝试设计一切外观,以确保我们从一开始就可以确保跨浏览器的兼容性,而无需诉诸奇怪的黑客补丁和亲自提供这些补丁浏览器。

想知道更多?



第2集-导航
在这一集中,我们将研究与导航相关的大量工作。

from selenium import webdriver

driver = webdriver.Firefox()
driver.get("https://www.theautomatedtester.co.uk")


我们在上方看到的内容看起来很简单,对,但是就在这里!

实际上,这使我陷入了冷酷的采访。如果有人在键入URL并按Enter键时要求您描述浏览器中发生的情况,则很有可能他对导航中发生的事情一无所知。无论如何...回到Selenium及其导航。 一旦我们通过传输层发送了请求,真正的乐趣就开始了。我们需要找出我们要去的地方,并告诉浏览器为我们去。不幸的是,这将导致许多自动化问题中的第一个。

driver.get



证明书


如果您曾经在技术不是主要技术的大型公司工作过,那么您将了解开发团队可能面临的痛苦。现在将这种痛苦加倍,您可以想象测试人员和自动化工程师必须应对的痛苦。

这些难题之一就是证书。公司会小气,会做出自签名证书和其他变形。特别是在Selenium的早期,没有像Let's Encrypt这样服务即使是现在,大多数开发人员和质量检查小组也很少能够在其测试环境或CI服务器中访问配置更改。我们需要找到一种解决证书的方法。这是硒被视为安全风险的第一个原因。

因此,每个浏览器在自动化期间都会跳过配置错误的证书。如果他们没有意识到这一点,那么许多测试人员/开发人员将没有机会测试他们的站点。

现在...当我们解决第一个问题时,我们需要继续加载页面。

载入中


收到证书后,即可下载页面。幸运的是,我们不需要做比同等复杂的事情

location = "https://www.theautomatedtester.co.uk"; 
// 
window.location.href = "https://www.theautomatedtester.co.uk";


完成...


当硒“完成”团队后,我们将获得退款。因此,我们只需要等待页面加载即可。坦率地说,“完成装载”什么意思

浏览器将触发几个不同的事件。我们将知道页面何时显示,然后是什么readyState。硒将测试所有这一切,还将等待DOMContentLoaded

然后,如果您在页面上并尝试跳至该页面的锚点,则会出现问题。让我们看下面的例子。

from selenium import webdriver

driver = webdriver.Firefox()
driver.get("https://www.theautomatedtester.co.uk")
driver.get("https://www.theautomatedtester.co.uk#someAnchor")


哦,只是看,不会触发任何页面加载事件!类?一个愚蠢的浏览器将有效地工作,只需滚动到锚点即可。这意味着我们不能仅仅依靠页面发出的事件。

不,因此,在这种情况下,我们需要特殊的代码,并且需要了解“就绪”在这种情况下的含义。如果我们犯了一个错误,这将创建许多不稳定的测试。不稳定的测试会使人脾气暴躁,我们不希望脾气暴躁的开发人员,世界上有足够的开发人员并且没有不稳定的测试。

完成这些检查后,如果希望使用“ 页面加载策略”更快地加载它们,则可以操纵我们查看这些事件的方式。这更像是摊铺机用户功能,因此我现在不再理会它们,但是它们会影响导航命令的速度。

JavaScript框架和导航又如何呢?


这是所有“乐趣”都集中的地方。在初始加载页面后,许多框架仍然会加载很多东西。如果您曾经在单页应用程序上工作或曾经使用过它,则在加载时会看到许多显示的元素。不幸的是,这意味着您不能仅仅依靠导航命令的返回。WebDriverWait如下所示,您需要在代码中添加命令,以确保测试处于正确的状态,然后再执行所需的操作。

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Firefox()
driver.get("https://www.theautomatedtester.co.uk")
element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id(“someId”))


结论


加载页面时,不要总是依赖于Selenium在页面完成加载后返回。如果您需要查看页面上的元素,请执行此操作。只要知道页面上的JavaScript在初始加载后如何更改它即可。

进一步阅读






了解有关该课程的更多信息



All Articles