如何使用Selenium Webdriver进行交叉浏览器测试
>本文最初发表在lambdatest上。感谢您支持使SitietPoint成为可能的合作伙伴。 硒是一种流行的自动化测试框架,主要用于跨浏览器测试。它是开源的,非常适合对Firefox,Chrome,Internet Explorer和Microsoft Edge等不同浏览器进行自动测试。 Selenium已成为著名的框架,并为其他测试框架(例如HP QTP(快速测试专业))和AKA HP UFT(统一功能测试)提供了激烈的竞争。该Selenium Webdriver的本教程将帮助您对Selenium Suite,Selenium Webdriver Architecture的组件的基本了解,并将向您展示如何运行自动化以测试使用Selenium Web Driver使用Google Chrome,Mozilla Firefox和Mozilla Firefox和Mozilla Firefox和Mozilla Firefox和Mozilla Firefox和Mozilla firefox,Mozilla Firefox和Mozilla Firefox和Mozilla firoge compatibility测试网站Internet Explorer。
硒是不同工具的组合,每个工具在自动化网络测试中起着至关重要的作用。让我们深入研究Webdriver教程。
>钥匙要点
了解硒组件:掌握硒IDE,Webdriver,网格和遥控器的角色,以有效自动化和管理跨浏览器测试。
- >使用WebDriver进行直接浏览器通信:了解Selenium Webdriver如何直接与无中间人进行浏览器进行交互,从而使其对于浏览器自动化而更快,更可靠。
- > >使用硒网格实施并行测试:利用硒网格在不同环境中并行运行测试,这有助于大大减少测试执行时间。 在lambdatest上配置和运行测试:探索如何远程使用Lambdatest的Cloud Selenium Grid来执行测试,从而允许访问多个浏览器版本和无本地基础结构的操作系统。
- 处理实用的测试方案:在编写硒脚本上获得洞察力,以处理现实世界测试方案,例如弹出窗口,动态元素和Ajax调用,并使用显式等待和其他Selenium Web Driver Techniques。 >通过并行执行优化测试:在lambdatest等平台上利用并行测试,以最大程度地减少总测试执行时间,从而可以同时运行更多的测试。
- >
- 硒套件的组件 以下是硒测试套件的核心组成部分:
- 硒综合开发环境(IDE)
- >硒遥控器(RC)
> Selenium webdriver
>硒网格
- 现在,让我们在此Selenium Webdriver教程中查看这些组件。
硒综合开发环境(IDE)
> Selenium IDE是一个简单的Firefox插件,用于录制和播放脚本。但是,Selenium IDE只能用于编写自动化脚本以自动化简单用例的测试。硒IDE不支持有条件的语句,异常处理,循环,屏幕截图捕获等。对于自动化复杂用例,大多数开发人员和测试人员都喜欢选择脚本测试而不是记录和重播测试。硒测试套件由硒遥控器(RC)或Selenium webdriver组成。
> Selenium IDE可用于不同操作系统,即Windows,Linux,Mac OS等。可以在此处下载Firefox的Selenium IDE。
>硒遥控器(RC)硒服务器是Selenium RC的核心组件。 Selenium RC的一些核心功能/职责如下:
>- 客户端程序将命令发送到RC,然后由服务器解释,然后发送到浏览器。
- 执行后,结果将发送回客户端。 >
- 客户端和服务器通过HTTP获取和帖子的普通机制进行通信。
> - >如前所述,Selenium RC支持不同的浏览器,与仅适用于Mozilla Firefox的硒IDE不同。 Selenium RC的缺点是它不支持记录和播放功能,这在任务是重复性的测试用例的自动化中至关重要,尤其是对于回归测试。在使用Selenium RC执行测试之前,应手动调用Selenium RC服务器的实例,并且该实例应在整个测试周期中运行。 >
- > Selenium webdriver
> Selenium Webdriver直接与浏览器通信,因此它不需要任何单独的组件,例如Selenium Server。它支持对软件测试仪的顶级编程语言,即C#,Ruby,Java,Python,Perl等。执行。您可以从下面提到的链接中下载Selenium webdriver:
- firefox
-
chrome - > Internet Explorer
- Microsoft Edge
- >硒网格
> 回到基础知识:硒网格主要用于并行测试,因为它有助于同时在不同的机器上对不同的机器运行测试。它与Selenium RC一起完成了工作。显示硒网格使用情况的一个示例如下:
<span>from selenium import webdriver </span><span>from selenium.webdriver.common.keys import Keys </span> desired_cap <span>= { </span><span>'platform' : 'win10', </span><span>'browserName' : 'chrome', </span><span>'version' : "67.0", </span><span>} </span> url <span>= "https://username:acsessToken@{LMABDA GRID URL}/wd/hub" </span> driver <span>= webdriver.Remote( </span> desired_capabilities<span>=desired_cap, </span> command_executor<span>= url </span><span>) </span> driver<span>.implicitly_wait(1) </span>driver<span>.get("http://www.google.com/") </span>driver<span>.quit() </span>
登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制JSON WIER协议
- >浏览器驱动程序
- 浏览器
- >让我们更详细地检查每个组件。
- selenium客户端库
> JSON WIER协议
> JSON(JavaScript对象符号)线协议促进了客户端和服务器之间的数据传输。这是基于其余的基于API(代表性状态转移)。每个浏览器都会有自己的浏览器驱动程序。
>浏览器驱动程序
>浏览器驱动程序主要用于与浏览器进行通信。由于未揭示浏览器的内部逻辑及其功能,因此浏览器驱动程序确保了“封装”的必要层,以使执行级别的详细信息更加抽象。每个浏览器都有其相应的浏览器驱动程序。
浏览器
>由于浏览器驱动程序可用于Chrome,Firefox,Internet Explorer,Safari和Microsoft Edge等流行浏览器,因此您可以使用其中任何一个用于执行交叉浏览器测试。应该注意的是,您无法在浏览器无法公开的浏览器上对网站进行交叉浏览器测试。
>
Lambdatest现在与云层硒网格一起生活 Lambdatest提供了云层硒网格,可帮助您快速跟踪自动化测试过程。 Selenium Grid提供了2000多个真正的浏览器和浏览器版本,可在众多操作系统上运行。您可以使用lambdatest硒网格执行并行测试,而不必担心在本地机器上安装任何重型基础架构,此外,您还可以获得各种各样的浏览器来最大程度地提高测试覆盖。 您可以运行的并行会话数量的数量完全取决于您选择的并发会话。并行测试可以帮助您彻底修剪测试周期。例如,假设您有一个测试套件,该套件需要60分钟而无需并行测试。现在,如果您有2个并发症,则可以同时运行2个测试,将总测试时间缩短至30分钟。同样,如果您有3个并发,则总考试时间将进一步降低到20分钟。使用lambdatest并发计算器来计算根据测试套件可能需要多少个并发会话。
> Selenium webdriver In Action
>现在您已经知道了硒和浏览器驱动程序的基础知识,现在该看看一个简单的WebDriver脚本了。在查看示例之前,请确保您已经准备好编程环境(我们正在使用Eclipse,其中包含从Eclipse Marketplace下载的所有必需软件包)。可以在此处下载Eclipse的硒插件。示例代码已经用Python语言编写,但是您可以在C#,Java,Perl,Ruby等中编写测试代码。>
> firefox webdriver示例由于测试代码将与浏览器(Chrome,Firefox,Internet Explorer等)进行通信,因此请确保将相应的客户端库/Web Driver安装在您的计算机中。请参阅有关如何下载相应的WebDriver的部分浏览器驱动程序。
是使用硒,Firefox Webdriver打开网页的示例代码:> 下面的 > <span>from selenium import webdriver </span><span>from selenium.webdriver.common.keys import Keys </span> desired_cap <span>= { </span><span>'platform' : 'win10', </span><span>'browserName' : 'chrome', </span><span>'version' : "67.0", </span><span>} </span> url <span>= "https://username:acsessToken@{LMABDA GRID URL}/wd/hub" </span> driver <span>= webdriver.Remote( </span> desired_capabilities<span>=desired_cap, </span> command_executor<span>= url </span><span>) </span> driver<span>.implicitly_wait(1) </span>driver<span>.get("http://www.google.com/") </span>driver<span>.quit() </span>
登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制>让我们浏览代码。在我们执行任何操作之前,所有必要的模块是使用“import
> selenium.common.exceptions.webdriverexception:消息:'Operadriver'可执行文件需要在路径中。 当我们尝试为Opera浏览器加载WebDriver时,显示了错误消息(在计算机上没有安装WebDriver)。为了摆脱错误,您应该为Opera安装WebDriver。> >一旦浏览器上的所有操作都完成,ff_driver.close()将被调用以进行必要的清理并释放资源。
> 为了执行代码,您可以在Eclipse IDE中调用Ctrl F9或使用Python命令行选项来调整CTRL F9:>
> chrome webdriver示例
>我们的Selenium Webdriver教程中的上一节,我们使用了Firefox Webdriver。在本节中,我们会查看如果您使用Chrome浏览器进行测试,则需要的更改。 You should ensure that the standalone ChromeDriver binary (which is different than the Chrome browser binary) is available in the right path or it is present as a part of the webdriver.chrome.driver environment variable.如果您使用的是Windows,则需要首先从此处下载Chrome Webdriver。将Chromedriver.exe粘贴到您安装Python的位置(在我们的情况下,这是默认的安装路径,即C:Python27Scripts)。您必须加载相应的Webdriver [第8行],其余代码保持不变。以下是代码段,更改(Chrome Webdriver所需的)以不同的颜色突出显示:
<span>from selenium import webdriver </span><span>from selenium.webdriver.common.keys import Keys </span> desired_cap <span>= { </span><span>'platform' : 'win10', </span><span>'browserName' : 'chrome', </span><span>'version' : "67.0", </span><span>} </span> url <span>= "https://username:acsessToken@{LMABDA GRID URL}/wd/hub" </span> driver <span>= webdriver.Remote( </span> desired_capabilities<span>=desired_cap, </span> command_executor<span>= url </span><span>) </span> driver<span>.implicitly_wait(1) </span>driver<span>.get("http://www.google.com/") </span>driver<span>.quit() </span>
登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制Internet Explorer WebDriver示例
到目前为止,在我们的Selenium Webdriver教程中,我们已经使用Firefox Webdriver&Chrome Webdriver展示了交叉浏览器测试。在本节中,我们会查看如果您使用Chrome浏览器进行测试,则需要的更改。您应该从此处或此处下载正确的Internet Explorer Webdriver(32位/64位)。将Internet ExcplorerDriver.exe粘贴到您安装Python的位置(在我们的情况下,这是默认的安装路径,即C:Python27Scripts)或您选择的任何其他位置。如果您将Internet Explorer Web Driver复制到存在Python可执行文件的路径中,则无需在加载Web驱动程序时提及“绝对路径” [LINE 7]。在另一种情况下,您必须指定绝对路径[第9行]。以下是代码片段,具有更改(IE WebDriver所需的),以不同的颜色突出显示:>终于,在我们的Selenium Webdriver教程中,我们将查看另一个示例,在该示例中,我们使用ActionChinains模块,该模块用于自动化低级交互,例如鼠标运动,按钮运动,上下文菜单互动等,以确保强大UI设计。有关ActionChains的更多详细信息可以在此处找到。<span># Import the necessary modules for development </span><span>import time </span><span>import unit test </span><span>from selenium import web driver </span> <span># Invoke a new Firefox Instance </span>ff_driver <span>= webdriver.Firefox() </span> <span># Blocking wait of 30 seconds in order to locate the element </span>ff_driver<span>.implicitly_wait(30) </span>ff_driver<span>.maximize_window() </span> <span># Open the required page </span>ff_driver<span>.get("http://www.lambdatest.com") </span> <span># Sleep for 10 seconds in order to see the results </span>time<span>.sleep(10) </span> <span># Close the Browser instance </span>ff_driver<span>.close() </span>
登录后复制登录后复制>
>在上面的示例代码中可以看到,我们保留了用于创建Firefox WebDriver实例的代码[第9〜16行]。有几个新模块被导入 - 动作链和钥匙。一旦所需的网页即https://www.lambdatest.com/浏览器打开,通过查看链接文本(使用Find_element_by_link_text方法),可以执行搜索操作。在我们的示例中,网页上搜索的链接文本是“支持” [行20〜22]。<span># Import the necessary modules for development </span><span>import time </span><span>import unit test </span><span>from selenium import web driver </span> <span># Invoke a new Chrome Instance </span>ff_driver <span>= webdriver.Chrome() </span> <span># Blocking wait of 30 seconds in order to locate the element </span>ff_driver<span>.implicitly_wait(30) </span>ff_driver<span>.maximize_window() </span> <span># Open the required page </span>ff_driver<span>.get("http://www.lambdatest.com") </span> <span># Sleep for 10 seconds in order to see the results </span>time<span>.sleep(10) </span> <span># Close the Browser instance </span>ff_driver<span>.close() </span>
登录后复制>遇到搜索条件后,执行(CTRL单击)操作,从而在“新标签”中打开该页面[第26〜30行]。 ActionChains模块用于执行该操作。输出在下面:
>我们已经使用了动作链,因为它很适合我们上面展示的示例。您可以在此处查看Selenium Webdriver模块下的不同模块(对于Python)。尽管我们使用Python语言进行实施,但您可以使用您选择的编程语言(C#,Java,Perl,Ruby,Php)。
本地webdriver - 不太刻板的方法
如果您计划在有限数量的“浏览器操作系统设备”组合中测试您的网站,则可以使用本地WebDriver进行测试。但是,如果组合的数量更多,则方法可能会步断。您不能为每种组合都有本地设置,因为这不是一种可扩展的方法,也可能是非常昂贵的。>一个更好的解决方案是利用Lambdatest这样的平台的功能,您可以在云上进行跨浏览器测试。使用LambDatest,您可以在2000个不同的浏览器,操作系统和设备配置中验证您的网站。首先,您需要在lambdatest上创建一个帐户。由于您将使用远程WebDriver(在Lambdatest上使用Selenium Grid)来测试您的Web应用程序,因此您应该从Lambdatest配置文件中记下有关用户名和访问密钥的注释。
>
>使用lambdatest的远程webdriver运行硒脚本> 例如,如果需要在Ubuntu OS Chrome上执行测试,则服务器/集线器将通过注册的服务器注册的客户端/节点的功能进行扫描,并将请求转移到具有匹配功能的客户端。硒架构中只能有一台服务器和数量的客户端。有关远程驱动程序API的更多详细信息可以在lambdatest网站上的其他博客上获得。
>登录到lambdatest后,您应该通过访问lambdatest功能生成器来生成节点所需的功能。选择您喜欢的编程语言(在我们的情况下是Python)和适当的OS/浏览器组合。您可以在设置功能时启用屏幕截图和视频录制功能。如下所示,我们的要求是测试应在Windows 10机器上安装的Firefox(版本64.0)上执行。该要求的功能如下:
>下面的
是Lambdatest功能生成器的屏幕截图:> <span>from selenium import webdriver </span><span>from selenium.webdriver.common.keys import Keys </span> desired_cap <span>= { </span><span>'platform' : 'win10', </span><span>'browserName' : 'chrome', </span><span>'version' : "67.0", </span><span>} </span> url <span>= "https://username:acsessToken@{LMABDA GRID URL}/wd/hub" </span> driver <span>= webdriver.Remote( </span> desired_capabilities<span>=desired_cap, </span> command_executor<span>= url </span><span>) </span> driver<span>.implicitly_wait(1) </span>driver<span>.get("http://www.google.com/") </span>driver<span>.quit() </span>
登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制>由于我们将在Lambdatest服务器上使用Selenium Grid,因此我们需要修改代码以访问其云基础架构(也称为远程URL)。远程URL如下所示:
<span>from selenium import webdriver </span><span>from selenium.webdriver.common.keys import Keys </span> desired_cap <span>= { </span><span>'platform' : 'win10', </span><span>'browserName' : 'chrome', </span><span>'version' : "67.0", </span><span>} </span> url <span>= "https://username:acsessToken@{LMABDA GRID URL}/wd/hub" </span> driver <span>= webdriver.Remote( </span> desired_capabilities<span>=desired_cap, </span> command_executor<span>= url </span><span>) </span> driver<span>.implicitly_wait(1) </span>driver<span>.get("http://www.google.com/") </span>driver<span>.quit() </span>
登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制@hub.lambdatest.com/wd/hub是在Lambdatest上执行测试的Lambdatest上的Selenium Grid设置。为了用户授权目的,将User_name(用于Lambdatest上的注册)和App_key(访问 - toke)附加到网格URL。串联字符串形成远程_url。现在,您已经知道了远程WebDriver API和功能生成器,让我们端口以适合这些要求的示例。
>parallel_test_example-1.py
>让我们进行代码演练,尤其是主要更改:<span># Import the necessary modules for development </span><span>import time </span><span>import unit test </span><span>from selenium import web driver </span> <span># Invoke a new Firefox Instance </span>ff_driver <span>= webdriver.Firefox() </span> <span># Blocking wait of 30 seconds in order to locate the element </span>ff_driver<span>.implicitly_wait(30) </span>ff_driver<span>.maximize_window() </span> <span># Open the required page </span>ff_driver<span>.get("http://www.lambdatest.com") </span> <span># Sleep for 10 seconds in order to see the results </span>time<span>.sleep(10) </span> <span># Close the Browser instance </span>ff_driver<span>.close() </span>
登录后复制登录后复制> - >使用webdriver.remote API代替本地webdriver api。远程WebDriver API有两个参数 - command_executor:执行测试和Desired_capabilities的网格设置:节点的所需功能/要求。根据这些功能要求,选择了执行代码的适当节点。
- 为了检查测试状态,您需要访问lambdatest仪表板。您可以通过其构建名称搜索测试,该名称用于形成功能。在lambdatest网格上执行上述测试的屏幕截图在下面。
>
异常 - 列出在执行测试代码期间遇到的异常。
logs - 此选项卡显示硒日志以及控制台日志。调试您的代码可能非常方便。>
- >平行测试 - 加速您的测试周期 在Lambdatest上,可以加速您的整个测试过程的一项功能是并行测试。根据您选择的定价模型,您可以同时执行测试,以减少总体测试执行时间。在我们的情况下,我们可以进行两个并发会议。越多的会话,总的测试执行时间较短。
为了证明并行化的特征,我们以并发的方式执行了两个测试执行。与上一个示例(Parallel_test_example-1.py)一起,我们同时执行第二个测试(parallel_test_example-2.py)。
parallel_test_example-2.py
<span>from selenium import webdriver </span><span>from selenium.webdriver.common.keys import Keys </span> desired_cap <span>= { </span><span>'platform' : 'win10', </span><span>'browserName' : 'chrome', </span><span>'version' : "67.0", </span><span>} </span> url <span>= "https://username:acsessToken@{LMABDA GRID URL}/wd/hub" </span> driver <span>= webdriver.Remote( </span> desired_capabilities<span>=desired_cap, </span> command_executor<span>= url </span><span>) </span> driver<span>.implicitly_wait(1) </span>driver<span>.get("http://www.google.com/") </span>driver<span>.quit() </span>
登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制>通过调用Python命令在两个不同的终端上并行执行两个测试。
下面的
>
>
>我如何使用selenium webdriver? 🎜>处理动态的网络元素在Selenium Webdriver中可能具有挑战性。但是,您可以使用各种策略来处理它们。一种常见的方法是使用硒的明确等待功能。这使您的脚本可以暂停一定时间,直到满足特定条件为止,例如DOM中的元素的存在。另一种方法是使用XPATH或使用通配符字符的CSS选择器来匹配元素属性的动态部分。>如何使用Selenium webdriver运行并行测试以更快地执行?运行并行测试在Selenium WebDriver中,您可以使用支持并行执行的测试框架,例如TestNG或Pytest。在testng中,您可以在testng.xml文件中的套件标签中设置并行属性,以将其指定为方法或测试,并将线程计数属性指定为要使用的线程数。在PYTEST中,您可以使用pytest -xdist插件,并使用-n选项指定命令行中的进程数。>如何使用Selenium Webdriver处理弹出窗口或警报?您可以使用switchto()。alert()方法切换到警报,然后使用ACCEPT(),dimpttext(),getText()或sendkeys()方法与警报进行交互。请记住,处理警报后要切换回主窗口。
>如何使用Selenium WebDriver进行测试故障的屏幕截图?
Selenium WebDriver提供TakessCreenshot接口以捕获屏幕截图。您可以使用getScreenshotas()方法进行屏幕截图并将其保存到文件中。您可以在try-catch语句的捕获块或测试框架的回忆中调用此方法,以捕获测试故障的屏幕截图。>如何使用Selenium WebDriver?
> Selenium Webdriver提供了与下拉菜单交互的选择类。您可以通过将下拉元素传递给其构造函数来创建选择类的对象。然后,您可以使用selectbyvisibletext(),selectbyvalue()或selectbyIndex()方法选择一个选项。您还可以使用getOptions()方法在下拉列表中获取所有选项。如何使用selenium web driver?selenium webdriver允许您使用sweettto切换到IFRAMES( ).frame()方法。您可以将索引,名称或ID或IFRAME元素传递给此方法。与iframe互动后,请记住使用switchto()。defaultContent()方法。
>我如何使用selenium webdriver?
selenium webdriver提供方法提供方法与cookie互动。您可以使用AddCookie()方法添加cookie,getCookienamed()方法获取特定cookie,getCookies()获取所有cookie的方法,以及deletecookie(),deletecookienamed(),deletealllookies()或deleteallcookies()方法删除cookie。>如何使用Selenium webdriver来处理Ajax调用?>在Selenium WebDriver中处理Ajax调用可能很棘手,因为它们是异步的,并且可能需要一些时间才能获取数据。您可以使用明确的等待预期的条件等待等待,直到AJAX调用完成并加载数据。处理键盘和鼠标事件的课程。您可以创建一个操作类的对象,并使用其方法,例如click(),doubleclick(),contextClick(),dragandDrop(),keydown(),keyup()等,以模拟各种键盘和鼠标操作。 🎜>
以上是如何使用Selenium Webdriver进行交叉浏览器测试的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

该试点程序是CNCF(云本机计算基础),安培计算,Equinix金属和驱动的合作,简化了CNCF GitHub项目的ARM64 CI/CD。 该计划解决了安全问题和绩效

该教程通过使用AWS服务来指导您通过构建无服务器图像处理管道。 我们将创建一个部署在ECS Fargate群集上的next.js前端,与API网关,Lambda函数,S3桶和DynamoDB进行交互。 Th

与这些顶级开发人员新闻通讯有关最新技术趋势的了解! 这个精选的清单为每个人提供了一些东西,从AI爱好者到经验丰富的后端和前端开发人员。 选择您的收藏夹并节省时间搜索REL

Arm64 架构开源软件的 CI/CD 难题与解决方案 在 Arm64 架构上部署开源软件需要一个强大的 CI/CD 环境。然而,Arm64 和传统 x86 处理器架构的支持水平之间存在差异,Arm64 通常处于劣势。面向多种架构的基础设施组件开发人员对工作环境有一定的期望: 一致性:跨平台使用的工具和方法保持一致,避免因采用不太流行的平台而需要改变开发流程。 性能:平台和支持机制具有良好的性能,确保在支持多个平台时部署方案不会因速度不足而受影响。 测试覆盖率:对所有平台同时进行效率、合规性和

定制电信软件开发无疑是一项相当大的投资。然而,从长远来看,您可能会意识到,这样的项目可能更具成本效益,因为它可以像市场上任何现成的解决方案一样提高您的生产力。了解构建定制电信系统的最重要优势。 获取您所需的确切功能 您可以购买的现成电信软件有两个潜在问题。有些缺乏可能显着改善您工作效率的有用功能。有时您可以通过一些外部集成来增强它们,但这并不总是足以使它们变得出色。 其他软件功能过多,使用起来过于复杂。您可能不会使用其中的一些(永远不会!)。大量的功能通常还会增加价格。 基于您的需求
