如何使用Selenium WebDriver执行本地化测试?

自动化测试对于交付成功的Web产品的整个过程至关重要。 如果网站或网络应用是面向全球受众(尤其是非英语受众)构建的,则与测试网站或网络应用相关的挑战将越来越多。 必须执行自动化测试以确保产品功能(包括内容)适合特定的地区。 这就是为什么在为“世界”构建大量软件产品时,使用Selenium WebDriver进行本地化测试变得越来越重要的原因!

我们确定您一定会遇到某些情况,其中网站的某些内容或部分内容未能在特定位置正确显示。 这是大多数Selenium测试自动化工程师经常遇到的难题,格式错误的字符串很可能是资源文件的一部分。 作为使用Selenium WebDriver进行本地化测试的一部分,我们需要在应用本地化自动化测试后验证网站(或应用程序)的外观和功能是否相同。

这正是该博客旨在提供的内容。 在本博客的最后,您将轻松地使用Selenium WebDriver进行本地化测试,因为我们涉及到本地化的关键方面,包括如何执行本地化自动化测试。

什么是本地化自动化测试?

本地化测试是非功能测试的一种形式,其中针对特定区域性或特定区域设置对产品的本地化版本进行交叉检查。 在大多数情况下,非本地化产品中的功能与本地化产品相同; 因此,UI和内容是受本地化测试影响的主要领域。

许多工程师和测试人员可以互换使用本地化测试和全球化测试,但是它们之间存在巨大差异。 顾名思义,全球化主要关注产品的全球(或全球)功能,而本地化主要关注属于给定文化或地区的特定用户集合。 然后,进行国际化测试,这有助于准备产品,使其可以在全球范围内以不同的语言,地区和地区使用。

下面显示的是Google主页的快照,其区域设置分别设置为“ zh-HK”(中文-香港)和“ he-IL”(希伯来语-以色列):

为了清楚起见,对本地化区域进行了标记,主要包括主页上提供的“翻译字符串”。

本地化测试也称为“ l10n”,因为“本地化”一词中L和N之间有十个字符。

本地化测试的基本功能

本地化测试是一种非功能性的测试形式。 这就是为什么要使用它来测试用户界面,地址,字符串(或语言词汇),日期和时间,日历,货币格式以及其他区域或特定于区域的元素的显示顺序的原因。

下面列出了本地化测试的一些关键功能(或为什么您应该执行本地化自动化测试):

用户界面的本地化

如上图所示,使用两种不同语言的Google截图中,用户界面必须经过量身定制,以供目标人群(或用户)使用。

内容位置

两种语言之间的关键区别在于内容,因为需要对其进行调整以适应当地的文化。 应该使用Selenium WebDriver进行本地化测试,以检查是否适合目标本地类别。

内容还包括应该与目标区域的语言一致的本地化语言。 例如,中文风味的“ zh-SG”和“ zh-HK”应分别用于中文-新加坡语言环境和中文香港特别行政区中国语言环境。

硬件相容性

通过在浏览器,平台(操作系统)和设备(或仿真器)的不同组合上执行本地化测试,可以使用Selenium测试自动化来完成此任务。 您应该使用LambdaTest上的Selenium Grid云来使用Selenium WebDriver执行本地化测试,而不是使用本地Selenium Grid(这不是可伸缩的选项)。

“硬件兼容性”测试将检查针对目标语言环境(或区域)是否存在硬件和软件兼容性。

如何执行本地化测试?

针对非本地化方案的Selenium测试自动化与本地化方案之间的主要区别在于,执行测试所针对的目标地区和文化。 除了这些差异外,在本地化和非本地化(或正常)情况下,大多数步骤都保持不变。

您需要按照以下步骤执行本地化自动化测试:

进行本地化测试的功能的优先级

网站(或网络应用程序)可能包含“ N”个页面,重点放在用户界面和内容上。 必须通过适当的利益相关者的参与来确定页面的本地化测试的优先级,以便发现对于本地化受众最重要的页面的问题。

设置测试环境

如果要加快本地化测试过程并打算在各种浏览器和平台组合上进行测试,则本地Selenium Grid上的Selenium测试自动化可能会遇到障碍。

将本地化测试移至LambdaTest之类的基于云的Selenium Grid可以加速测试过程,因为它利用了并行测试执行的优势。 与在本地Selenium Grid上执行测试相比,它是一种更具可伸缩性的方法。

拥有强大的测试环境对于加速GTM(进入市场)策略很有用,并且是利用本地化测试工具的最佳方法。

测试自动化脚本生成

这是使用Selenium WebDriver进行本地化测试中最关键的步骤。 在这里,将生成特定于目标语言环境和区域的测试自动化脚本。 在设计脚本时,应考虑可伸缩性和可用性(跨不同语言环境)。

例如,如果目标区域是以色列,则脚本中的语言环境应设置为“ he-IL”。 对于不同区域的自动化测试,应应用相同的原理。

执行和结果生成

与非本地化测试类似,应将网络产品的本地化属性与预期属性进行比较。 例如,应将测试页上的UI和内容与预期结果进行比较,并应由对目标语言具有专业知识的语言专家进行检查。

本地化测试清单

在开发执行本地化测试的自动化脚本时,有必要以可扩展的方式设计脚本,并且可以以最小的更改(或没有更改)将其扩展到不同的区域。

精心策划的是本地化测试应遵循的一些最佳实践:

熟悉当地语言的语言学家或在'i10n'工程领域具有公认专业知识的本地化公司应参与测试与审查过程。

在发送文本进行翻译之前,应将DBCS(双字节字符集)的现有实现国际化。

在设计Selenium Web自动化脚本时,您可以选择从Selenium中的Web定位器中进行选择,例如名称,ID,链接文本,类名,XPath等。 应该选择在不同语言环境下统一(或保持不变)的最合适的Web定位器。

这样可以确保在使用相同代码使用其他语言环境执行本地化测试时,代码更改最小。

在编写不同测试场景的脚本时,应避免重复工作。

建议将语言环境与实现分开(即,不对与语言环境相关的信息进行硬编码),以便添加(或删除)语言环境或区域变得容易。 这种方法将导致实施中的更改最少(或没有更改),从而减少了维护工作。

下面显示的是Google搜索页的示例,“搜索”按钮的XPath在不同的语言环境中均保持不变。 因此,在针对不同地区测试Google搜索功能时,可以使用XPath定位器。

应该使用用于生成报告的本地化测试工具或插件来生成测试报告,以便所有团队成员都在同一页面上。 产生的错误应由开发人员修复,并且必须重复执行上述步骤,直到产品达到“本地化产品发布”阶段为止。

下面显示的是“本地化测试生命周期”的详细视图。

本地化测试清单

在开发执行本地化测试的自动化脚本时,有必要以可扩展的方式设计脚本,并且可以以最小的更改(或没有更改)将其扩展到不同的区域。

精心策划的是本地化测试应遵循的一些最佳实践:

熟悉当地语言的语言学家或在'i10n'工程领域具有公认专业知识的本地化公司应参与测试与审查过程。

在发送文本进行翻译之前,应将DBCS(双字节字符集)的现有实现国际化。

在设计Selenium Web自动化脚本时,您可以选择从Selenium中的Web定位器中进行选择,例如名称,ID,链接文本,类名,XPath等。 应该选择在不同语言环境下统一(或保持不变)的最合适的Web定位器。

这样可以确保在使用相同代码使用其他语言环境执行本地化测试时,代码更改最小。

在编写不同测试场景的脚本时,应避免重复工作。

建议将语言环境与实现分开(即,不对与语言环境相关的信息进行硬编码),以便添加(或删除)语言环境或区域变得容易。 这种方法将导致实施中的更改最少(或没有更改),从而减少了维护工作。

下面显示的是Google搜索页的示例,“搜索”按钮的XPath在不同的语言环境中均保持不变。 因此,在针对不同地区测试Google搜索功能时,可以使用XPath定位器。

Google搜索按钮的XPath为// div [@ class ='FPdoLc tfB0Bf'] // input [@ name ='btnK'],在不同的语言环境中均保持不变。 因此,按钮的XPath可用于触发“搜索操作”,因为它与执行搜索的区域无关。 本地化测试的优点和缺点

本地化测试不是强制性的活动,仅当产品针对特定地区或语言时才需要执行。 用于本地化测试的selenium测试自动化具有其自身的优点和缺点,因为它是一项活动,不仅需要技术专业知识,还需要“语言”专业知识。

本地化测试的优势

让我们看一下与使用Selenium WebDriver进行本地化测试相关的优势:

它有助于开发可扩展的测试代码,这些代码可以扩展到其他语言环境(或地区)

尽管推出第一版本地化测试可能会花费一些时间,但其后续发行版和用于处理其他语言环境的测试将大大节省时间。

本地化测试的缺点

使用Selenium WebDriver进行本地化测试具有显着的优势,但也有其不足之处(或缺点)。 这是本地化自动化测试的缺点:

语言专家或具有翻译经验的本地化公司必须参与本地化测试过程。

DBCS(双字节字符集)的存储方式可能会因国家/地区和地区而异。 这些额外的复杂性可能会延迟测试活动。

聘请当地翻译公司或语言专家会增加整体预算。

演示:使用Selenium WebDriver进行本地化测试

在本节中,我们将了解在Selenium Grid上执行本地化测试的来龙去脉。 我们将在LambdaTest上使用基于云的Selenium Grid,以便我们可以使用不同的浏览器和操作系统组合来执行本地化自动化测试。

在本地化测试中,内容和UI会根据特定区域和语言环境的要求进行调整。 因此,本地化测试的第一步是检查是否设置了浏览器语言环境。

要在Chrome和Firefox上使用Selenium WebDriver更改浏览器的语言以进行多语言测试,可以通过分别为ChromeOptions和FirefoxOptions提供必要的选项来完成。 使用Selenium Python进行本地化测试

chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option('prefs', {'intl.accept_languages':'{locale}'.format(locale=language)})
capabilities = DesiredCapabilities.CHROME
web_driver = webdriver.Chrome(options=chrome_options, desired_capabilities=capabilities)
ff_profile = webdriver.FirefoxProfile()
ff_profile.set_preference("intl.accept_languages", language)
ff_profile.update_preferences()
capabilities = DesiredCapabilities.FIREFOX
web_driver = webdriver.Firefox(desired_capabilities = capabilities, browser_profile=ff_profile)

使用Selenium Java进行本地化测试

ChromeOptions chromeOptions = new ChromeOptions();
Map<String, Object> chrome_prefs = new HashMap<String, Object>();
chrome_prefs.put("intl.accept_languages", language);
chromeOptions.setExperimentalOption("prefs", chrome_prefs);
WebDriver web_driver = new ChromeDriver(chromeOptions);
FirefoxOptions firefoxOptions = new FirefoxOptions();
FirefoxProfile firefoxProfile = new FirefoxProfile();
firefoxProfile.setPreference("intl.accept_languages", language);
firefoxOptions.setProfile(firefoxProfile);
web_driver = new FirefoxDriver(firefox_options);

使用Selenium C#本地化测试

var chromeOptions = new ChromeOptions();
chromeOptions.AddUserProfilePreference("intl.accept_languages", language);
IWebDriver web_driver = new ChromeDriver(chromeOptions);
var firefoxOptions = new FirefoxOptions();
firefoxOptions.SetPreference("intl.accept_languages", language);
ICapabilities capabilities = firefoxOptions.ToCapabilities();
IWebDriver web_driver = new FirefoxDriver(firefoxOptions);

Selenium Grid Cloud上的本地化测试演示

我们将在Chrome和Firefox浏览器上使用Selenium和Python进行实时本地化自动化测试。 这是将针对不同的语言环境(或区域)进行检查的测试方案。 我们已使用Chrome的语言环境切换器扩展程序来确定实施中应使用的语言环境。

测试组合[浏览器– macOS Mojave上的Firefox 78.0和Windows 10,区域设置– he-IL,ar-BH,zh-HK和ar-DZ上的Chrome 80.0]

将Firefox浏览器的语言环境设置为所需的语言环境。

将Chrome浏览器的语言环境设置为被测语言环境。

浏览至网址https://www.google.com。

搜索“ LambdaTest”。

单击第一个链接并打开页面。

声明是否正确设置了语言环境,或者页面标题与预期标题不匹配。

在继续实施之前,您应该在LambdaTest上创建一个帐户,以便可以为上述测试方案创建所需的功能。 您应该在配置文件页面上记录用户名和访问键,就像在LambdaTest上访问Selenium Grid一样。

浏览器和平台组合的功能是使用LambdaTest功能生成器生成的。

import pytest
import pytest_html
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
import urllib3
import warnings
from time import sleep
import sys
 
ch_capabilities = {
        "build" : "[Python-1] Localization Testing with Chrome & Windows on LambdaTest Selenium Grid",
        "name" : "[Python-1] Localization Testing with Chrome & Windows on LambdaTest Selenium Grid",
        "platform" : "Windows 10",
        "browserName" : "Chrome",
        "version" : "80.0"
}
 
ff_capabilities = {
        "build" : "[Python-1] Localization Testing with Firefox & macOS on LambdaTest Selenium Grid",
        "name" : "[Python-1] Localization Testing with Firefox & macOS on LambdaTest Selenium Grid",
        "platform" : "macOS Mojave",
        "browserName" : "Firefox",
        "version" : "78.0"
}
 
user_name = "user-name"
app_key = "access-key"
 
@pytest.mark.parametrize(
                         "capabilities, test_url, b_locale",
                         [
                            (ch_capabilities, "https://www.google.com", "he-IL"), #Chrome - Hebrew
                            (ff_capabilities, "https://www.google.com", "he-IL"), #Firefox - Hebrew
                            (ff_capabilities, "https://www.google.com", "ar-BH"), #Firefox - Arabic Bahrain
                            (ch_capabilities, "https://www.google.com", "zh-HK"),  #Chrome - Chinese (Hong Kong)
                            (ch_capabilities, "https://www.google.com", "ar-DZ"),  #Chrome - Arabic Algeria
                            (ff_capabilities, "https://www.google.com", "ar-DZ"), # Firefox - Arabic Algeria
                            (ch_capabilities, "https://www.google.com", "ar-BH"), #Chrome - Arabic Bahrain
                            (ff_capabilities, "https://www.google.com", "zh-HK"),  #Chrome - Chinese (Hong Kong)
                         ]
                        )
def test_open_url(capabilities, test_url, b_locale):
    urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
    if capabilities["browserName"] == "Chrome":
        chrome_options = webdriver.ChromeOptions()
        chrome_options.add_experimental_option('prefs', {'intl.accept_languages':'{locale}'.format(locale=b_locale)})
        remote_url = "https://" + user_name + ":" + app_key + "@hub.lambdatest.com/wd/hub"
        web_driver = webdriver.Remote(command_executor = remote_url, desired_capabilities = capabilities, options=chrome_options)
    elif capabilities["browserName"] == "Firefox":
        ff_profile = webdriver.FirefoxProfile()
        ff_profile.set_preference("intl.accept_languages", b_locale)
        ff_profile.update_preferences()
        remote_url = "https://" + user_name + ":" + app_key + "@hub.lambdatest.com/wd/hub"
        web_driver = webdriver.Remote(command_executor = remote_url, desired_capabilities = capabilities, browser_profile=ff_profile)
 
    web_driver.get(test_url)
    web_driver.maximize_window()
    print("Searching lambdatest on google.com ")
    time.sleep(5)
    elem = web_driver.find_element(By.NAME, "q")
    elem.send_keys("LambdaTest")
    elem.submit()
    time.sleep(2)
 
    if (b_locale == "he-IL"):
        web_driver.find_element(By.XPATH, "//span[.='LambdaTest: Most Powerful Cross Browser Testing Tool ...']").click()
    elif (b_locale == "zh-HK"):
        web_driver.find_element(By.XPATH, "//h3[.='LambdaTest: Most Powerful Cross Browser Testing Tool Online']").click()
    elif (b_locale == "ar-BH") or (b_locale == "ar-DZ"):
        web_driver.find_element(By.XPATH, "//span[.='LambdaTest: Most Powerful Cross Browser Testing Tool ...']").click()
            
    time.sleep(5)
    title = "Most Powerful Cross Browser Testing Tool Online | LambdaTest"
    assert title ==  web_driver.title
            
    language = web_driver.execute_script("return window.navigator.userlanguage || window.navigator.language")
    assert language == b_locale
    web_driver.quit()

代码遍历

步骤1:使用LambdaTest功能生成器生成两种浏览器和操作系统组合的功能。 下面显示的是针对Chrome和Windows 10组合生成的功能-

ch_capabilities = {
        "build" : "[Python-1] Localization Testing with Chrome & Windows on LambdaTest Selenium Grid",
        "name" : "[Python-1] Localization Testing with Chrome & Windows on LambdaTest Selenium Grid",
        "platform" : "Windows 10",
        "browserName" : "Chrome",
        "version" : "80.0"
}

步骤2:标记@ pytest.mark.parametrize用于创建将输入设置为(浏览器功能,测试URL,测试区域设置)的参数化测试。


@pytest.mark.parametrize(
"capabilities, test_url, b_locale",
 [
   (ch_capabilities, "https://www.google.com", "he-IL"), #Chrome - Hebrew
   (ff_capabilities, "https://www.google.com", "he-IL"), #FF - Hebrew
   (ff_capabilities, "https://www.google.com", "ar-BH"), #FF - Arabic Bahrain
   ……………………………………..
   ……………………………………..
 ]

步骤3:测试函数test_open_url()具有输入参数(capabilities,test_url和b_locale)。 这些参数与@ pytest.mark.parametrize标记中使用的序列相同

def test_open_url(capabilities, test_url, b_locale): 

步骤4:根据执行测试的浏览器,使用必需的驱动程序选项(或配置文件选项)来设置语言环境。 对于Chrome浏览器,ChromeOptions中的add_experimental_option()方法用于将intl.accept_languages键设置为“受测语言环境”。

用户名和访问密钥的组合用于访问LambdaTest网格URL [@ hub.lambdatest.com / wd / hub]。 webdriver.Remote()的options参数设置为chrome_options,以便将设置的ChromeOptions(即chrome_options)用于自动化测试。

if capabilities["browserName"] == "Chrome":
        chrome_options = webdriver.ChromeOptions()
        chrome_options.add_experimental_option('prefs', {'intl.accept_languages':'{locale}'.format(locale=b_locale)})
        remote_url = "https://" + user_name + ":" + app_key + "@hub.lambdatest.com/wd/hub"
        web_driver = webdriver.Remote(command_executor = remote_url, desired_capabilities = capabilities, options=chrome_options)

步骤5:对于Firefox浏览器,创建一个FirefoxProfile实例。FirefoxProfile中的set preference()方法用于设置intl。接受测试区域设置的语言键。update preferences()方法用于更新配置文件设置。

elif capabilities["browserName"] == "Firefox":
        ff_profile = webdriver.FirefoxProfile()
        ff_profile.set_preference("intl.accept_languages", b_locale)
        ff_profile.update_preferences()
        remote_url = "https://" + user_name + ":" + app_key + "@hub.lambdatest.com/wd/hub"    

步骤6:将Remote WebDriver中的browser_profile设置设置为已创建(并使用测试语言环境)的Firefox配置文件。

web_driver = webdriver.Remote(command_executor = remote_url, desired_capabilities = capabilities, browser_profile=ff_profile)

步骤7:Chrome中的“ Web检查器”选项用于在Google主页上找到所需的网络元素。 Selenium WebDriver中的send_keys()方法用于将搜索词(即LambdaTest)传递到SearchBox,submit()方法用于触发搜索操作。

elem = web_driver.find_element(By.NAME, "q")
elem.send_keys("LambdaTest")
elem.submit()

步骤8:这是最关键的步骤,其中将针对每个语言环境(he-IL,ar-BH,zh-HK和ar-DZ)的“ LambdaTest的第一个搜索结果”的XPath用于自动化测试。

为了简化和加快过程,我们使用了Chrome中的POM Builder扩展来为每个结果查找XPath。

if (b_locale == "he-IL"):
        web_driver.find_element(By.XPATH, "//span[.='LambdaTest: Most Powerful Cross Browser Testing Tool ...']").click()
    elif (b_locale == "zh-HK"):
        web_driver.find_element(By.XPATH, "//h3[.='LambdaTest: Most Powerful Cross Browser Testing Tool Online']").click()
    elif (b_locale == "ar-BH") or (b_locale == "ar-DZ"):
        web_driver.find_element(By.XPATH, "//span[.='LambdaTest: Most Powerful Cross Browser Testing Tool ...']").click()

该实现可以轻松扩展以处理不同的方言,因为它们来自同一语言。 例如,ar-TD,ar-KM,ar-DJ等是源自阿拉伯语的不同方言。 可以将同一事物扩展为处理不同语言(例如,中文,日语等)的方言。

步骤9:Selenium WebDriver的execute_script()方法用于执行JS脚本以获取浏览器语言环境(即window.navigator.userlanguage或window.navigator.language)。

如果未正确设置区域设置或页面标题与预期标题不匹配,则会引发断言。


title = "Most Powerful Cross Browser Testing Tool Online | LambdaTest"
assert title ==  web_driver.title
            
language = web_driver.execute_script("return window.navigator.userlanguage || window.navigator.language")
assert language == b_locale

执行

通过在终端上调用pytest命令来执行执行。 由于测试是在基于LambdaTest的基于云的网格上运行的,因此我们利用pytest中的并行测试来并行运行4个测试。

pytest -s –v –n= 4 test_pytest.py

从LambdaTest的执行日志和自动化状态中可以看出,四个测试正在并行执行。

结论

如果必须根据目标区域的需求量身定制内容和UI,则本地化测试是最关键的练习之一。 对于本地化,必须拥有语言专家或由具有公认的专业知识的本地化公司参与; 否则,目标用户将发现(语言或UI)问题,这可能会妨碍整体体验。

使用Selenium WebDriver进行的本地化测试与LambdaTest之类的基于云的Selenium Grid一起使用时,可能会非常有用,因为它将加速测试过程。 selenium测试自动化工程师可以利用平台的并行测试功能和PyTest,Behave等测试框架来快速跟踪本地化测试过程。 我们希望您现在也可以实施此类本地化测试工具! 如果您有任何问题或疑问,请随时通过评论部分与我们联系。

测试愉快!

author

石头 磊哥 seven 随便叫

company

thoughtworks(离职)

大家好,本人不才,目前依旧混迹于thoughtworks,做着一名看起来像全栈的QA,兴趣爱好前端,目前是thoughtworks 西安QA社区的leader,如果有兴趣分享话题,或者想加入tw,可以找我

roles

QA(营生) dev(front-end dev 兴趣爱好)

联系方式

如果想转载或者高薪挖我 请直接联系我 哈哈

wechat:

qileiwangnan

email:

qileilove@gmail.com