标签: webdriver

页面对象模型:为什么不在页面方法中包含断言?

第一次海报.我已经在UI自动化领域工作了很多年,但最近才引入/指示使用Page Object Model.其中大部分是常识,包括我已经使用的技术,但有一个特别好的点我无法在自己的脑海中证明,尽管广泛搜索了一个合理的解释.我希望这里有人可以启发我,因为这个问题引起了一些惊愕,因为我试图将POM与我自己的最佳实践相结合.

来自http://code.google.com/p/selenium/wiki/PageObjects:

上面给出的代码显示了一个重要的观点:测试而不是PageObjects应该负责对页面状态进行断言....当然,正如每个指南都有例外......

来自http://seleniumhq.org/docs/06_test_design_considerations.html#chapter06-reference:

在如何设计页面对象方面有很多灵活性,但是有一些基本规则可以获得测试代码所需的可维护性.页面对象本身永远不应该进行验证或断言.这是测试的一部分,应该始终在测试代码中,而不是在页面对象中.页面对象将包含页面的表示形式,以及页面通过方法提供的服务,但是没有与正在测试的内容相关的代码应该在页面对象中.

有一个单一的验证可以而且应该在页面对象中,即验证页面以及页面上可能的关键元素是否已正确加载.应在实例化页面对象时完成此验证.

这两个"指南"都允许潜在的例外,但我对基本前提不能不同意.我习惯于在"页面方法"中进行大量的验证,我认为验证的存在是一种强大的技术,可以在各种环境中查找问题(即每次调用方法时都会进行验证)而不仅仅发生在特定测试的有限环境中.

例如,让我们想象一下,当您登录AUT时,会出现一些文本"以USER身份登录".有一个测试专门验证这个是合适的,但为什么不想在每次调用登录时验证它?这个工件与页面"是否正确加载"没有直接关系,并且它与"正在测试的内容"无关,因此根据上面的POM指南,它显然不应该是页面方法. ..但在我看来,它显然应该存在,通过尽可能经常地验证重要的工件来最大化自动化的力量,尽可能少的事先考虑.将验证码放入页面方法可以增加自动化的功能,允许您"免费"获得大量验证,而不必在测试中担心,并且在不同的环境中进行频繁验证通常会发现您不会发现的问题如果验证仅限于对该工件的单个测试.

换句话说,我倾向于区分特定于测试的验证和"一般"验证,并且我认为后者被广泛地包含在页面方法中是完全合适/可取的.这促进了更薄的测试和更厚的页面对象,这通常通过重用更多代码来提高测试可维护性 - 尽管这些指南中存在相反的争用.我错过了这一点吗?不希望在页面方法中进行验证的真正原理是什么?我所描述的情况实际上是这些指南中描述的"例外"之一,因此实际上与POM不一致吗?提前感谢您的想法.-jn-

ruby selenium webdriver pageobjects selenium-webdriver

34
推荐指数
4
解决办法
7718
查看次数

Selenium WebDriver如何解决过时的元素参考异常?

我在Selenium 2 Web驱动程序测试中有以下代码,它在我调试时有效,但是当我在构建中运行它时大部分时间都失败了.我知道它必须与页面没有刷新的方式有关,但不知道如何解决它所以任何关于我做错了什么的指针都很感激.我使用JSF primefaces作为我的Web应用程序框架.当我点击添加新链接时,会出现一个弹出对话框,其中包含一个我可以输入日期的输入框,然后单击保存.它是在输入元素输入文本,我得到一个陈旧的元素引用异常.

提前致谢

import static org.junit.Assert.assertEquals;

 import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.StaleElementReferenceException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;


public class EnterActiveSubmissionIntegrationTest {
Map<String, Map<String, String>> tableData = new HashMap<String, Map<String, String>>();

@Test
public void testEnterActiveSubmission() throws Exception {
    // Create a new instance of the Firefox driver
    // Notice that the remainder of the code relies on the interface, 
    // not the implementation.
    System.setProperty("webdriver.chrome.driver", "C:/apps/chromedriver.exe");
    WebDriver driver = …
Run Code Online (Sandbox Code Playgroud)

java selenium webdriver selenium-webdriver

34
推荐指数
6
解决办法
15万
查看次数

如何让Jenkins在部署时自动运行Selenium WebDriver/TestNG/Java测试以及Maven如何处理所有这些?

我现在已经研究了好几个小时,但我只发现了大局.他们在任何地方都假设读者已经建立了系统的一部分.

我认为将整个事物放在一起所需的部件的大图描述将是有用的.

他们都说"使用你的maven selenium测试"等等.

编辑:经过一些研究,我发现我需要在Jenkins和我的计算机上安装Maven,为Eclipse安装maven插件,并创建/转换我的项目作为Maven项目.如何在Jenkins中转移我的Maven项目?我是否导出到.jar,还是在服务器上移动整个文件夹?如何将整个事物与xvfb连接在一起?

所以这就是我目前所知道的

  1. 安装Jenkins(我们已在服务器上安装了)
  2. 为Jenkins安装插件(哪些?)
  3. 安装xvfb,以便在无头浏览器中运行测试(如何在Java编写的测试中指定?)
  4. 在计算机,jenkins和eclipse上安装Maven,使用maven项目.
  5. 我应该在eclipse工作区的哪个部分项目文件夹上传服务器以及在哪里?我有一个testng.xml文件和一些类(这是真正的测试)
  6. 如何告诉Jenkins在部署后自动运行Selenium Webdriver测试,我指向哪个文件?
  7. 如何获取报告 - 通过TestNg或通过一些Jenkins功能?

testng selenium webdriver maven jenkins

34
推荐指数
2
解决办法
5万
查看次数

Selenium WebDriver的isDisplayed()方法如何工作

我目前有很多情况需要验证页面(及其所有元素)是否正确显示.isDisplayed()WebElement 的方法似乎是一种逻辑方式,但我想准确理解这个方法正在做什么来确定元素是否"显示".所述的Javadoc在网络上似乎是稀疏充其量不棚上的方法和其它信息的内部运作任何光.

如果有人能提供这种方法如何运作的详细描述,我将非常感激.

selenium webdriver selenium-webdriver

34
推荐指数
2
解决办法
8万
查看次数

Selenium RC和WebDriver之间的关系是什么?

我可以看到,自从selenium 2.0,WebDriver和Selenium RC被打包在一起下载.现在我主要使用WebDriver,但是我可以从现在开始在我的测试脚本中引入Selenium RC吗?有没有Selenium RC能够做到但WebDriver没有,反之亦然?

selenium webdriver selenium-rc

33
推荐指数
2
解决办法
3万
查看次数

如何设置selenium webdriver获取超时?

当我在像FirefoxDriver这样的webdriver中使用代理时,如果代理不好,那么get方法将永远阻止.我设置了一些超时参数,但这没有用.

这是我的代码:

FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("general.useragent.override", ua);    
Proxy p = new Proxy();
p.setHttpProxy(proxy);
profile.setProxyPreferences(p);
profile.setEnableNativeEvents(true);

// create a driver
WebDriver driver = new FirefoxDriver(profile);
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
driver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS);
driver.get("www.sina.com.cn")
Run Code Online (Sandbox Code Playgroud)

对driver.get的调用将永远阻塞,但我希望它等待30秒,如果页面未加载则抛出异常.

java selenium webdriver

33
推荐指数
4
解决办法
13万
查看次数

无法执行dex:Java堆空间Java堆空间

我在Eclipse IDE中执行Web驱动程序脚本时无法执行dex:Java堆空间Java堆空间错误.我已经使用Android SDK和AVD Manager配置了Eclipse IDE.

我还增加了-Xms200m-Xmx512m,但没有奏效.

selenium android webdriver

32
推荐指数
2
解决办法
3万
查看次数

如何验证硒2中存在或可见的元素(Selenium WebDriver)

任何人都可以给我发送示例代码如何验证元素

  1. 存在
  2. 可见性
  3. isenable
  4. textpresent

在Selenium WebDrvier中使用Java

java webdriver selenium-webdriver

32
推荐指数
4
解决办法
25万
查看次数

在Java中,检查Selenium WebDriver是否已退出的最佳方法

我需要检查一个页面对象集合,看看每个页面对象是否在其WebDriver上调用了quit().

我编写了以下方法来检查WebDriver的状态:

public static boolean hasQuit(WebDriver driver) {
        try {
            driver.getTitle();
            return false;
        } catch (SessionNotFoundException e) {
            return true;
        }
}
Run Code Online (Sandbox Code Playgroud)

这是问题:我不喜欢抛出并捕获异常以发现布尔值的真实性,但似乎我没有选择,因为WebDriver API没有提供检查驱动程序是否已退出的方法.

所以我的问题是,是否有更好的方法来检查WebDriver是否已退出?

我在这里找到了一个类似的(也是更一般的)问题,但问题没有任何已经尝试过的代码,唯一的答案是在退出后总是将WebDriver设置为null(我不一定能控制) .

java selenium webdriver selenium-webdriver

32
推荐指数
3
解决办法
3万
查看次数

ImportError:没有名为'selenium'的模块

我正在尝试编写一个脚本来检查网站.这是我第一次使用硒.我正在尝试在OSX系统上运行脚本.虽然我检查了/Library/Python/2.7/site-packages并且selenium-2.46.0-py2.7.egg存在,但是当我运行脚本时它一直告诉我没有要导入的selenium模块.

这是我运行代码时得到的日志:

Traceback (most recent call last):
  File "/Users/GiulioColleluori/Desktop/Class_Checker.py", line 10, in <module>
    from selenium import webdriver
ImportError: No module named 'selenium'
Run Code Online (Sandbox Code Playgroud)

如果你能告诉我你是否知道什么可能导致这个问题值得高度赞赏.

谢谢.

python macos selenium module webdriver

32
推荐指数
6
解决办法
14万
查看次数