GVKun编程网logo

使用Webinator + Selenium,SpecFlow和NUnit的多个浏览器测试(浏览器测试用例)

20

在这篇文章中,我们将带领您了解使用Webinator+Selenium,SpecFlow和NUnit的多个浏览器测试的全貌,包括浏览器测试用例的相关情况。同时,我们还将为您介绍有关Applitools

在这篇文章中,我们将带领您了解使用Webinator + Selenium,SpecFlow和NUnit的多个浏览器测试的全貌,包括浏览器测试用例的相关情况。同时,我们还将为您介绍有关Applitools + Specflow + Selenium + C#、java selenium 打开多个浏览器执行的问题、org.openqa.selenium.htmlunit.HtmlUnitWebElement的实例源码、Python selenium 在测试之间共享第二个浏览器的知识,以帮助您更好地理解这个主题。

本文目录一览:

使用Webinator + Selenium,SpecFlow和NUnit的多个浏览器测试(浏览器测试用例)

使用Webinator + Selenium,SpecFlow和NUnit的多个浏览器测试(浏览器测试用例)

我正在使用Selenium驱动程序使用WebinatorSpecFlow + NUnit开发ASP.NET MVC
3应用程序。我在使用Chrome(使用chromedriver)和Internet Explorer运行并行测试时遇到问题。

每当我通过Webinator在Selenium中通过同一个会话同时运行两个测试时,当我向页面发送任何点击动作时,IE似乎都会挂起。

我无法使用此处建议的解决方案,因为SpecFlow会自动生成底层的C#代码。我的解决方案的设计像这样(完整的代码可以作为一个要点):

_multipleBrowsers.RunTest(web => web.GoToUrl("http://localhost/PROJECT/Authentication/Registration"));

发生的是,我为需要测试的每个浏览器实例化了一个新的IWebManager。然后,我使用浏览器实例调用委托动作。它是这样的:

        foreach (var web in _webManagers)        {            Debug.WriteLine("Running test with " + web.Config.Browser);            action(web);        }

这样,测试几乎可以并行运行。它弹出一个浏览器,执行操作,然后另一个浏览器,依此类推。

关于如何解决此ChromeDriver问题有任何想法吗?我应该针对多个浏览器使用SpecFlow更改测试方法吗?


参考文献:

  • webinator
  • specflow
  • nunit
  • ChromeDriver

答案1

小编典典

您可以在更简单的只是使用

然后使用标记@Browser:IE编写功能

@Browser:IE@Browser:FirefoxScenario: Add comments       Given I navigated to /guinea-pig       And I have entered ''This is not a comment'' into the commentbox       When I press ''submit''        Then my comment ''This is not a comment'' is displayed on the screen

目前,这是我发现的最佳解决方案,因为它还可以在所有浏览器中进行测试,而无需在所有特定浏览器中进行测试

Applitools + Specflow + Selenium + C#

Applitools + Specflow + Selenium + C#

如何解决Applitools + Specflow + Selenium + C#?

我正在寻求帮助,我已经绝望了。

我使用 Gherkin 创建了一个简单的测试脚本,并生成了步骤。我想将 applitools 集成到此过程中,即使用 eyes.Check() 方法。但是无论我怎么努力,每次初始化眼睛对象时,都会出现以下错误:找不到方法:“ applitools.BatchInfo applitools.IEyesBase.get_Batch()

applitools.com上的示例不适合我,因为相同的 Ruby 实现不适用于我,并且 C# 示例不涉及使用Gherkin。

我的情况:

@Default.Target.Environment:Edu
Feature: LoginScenario

@INWK.LP.C0002
Scenario: L001_Login
When I open Web Site
    And I login as user my_email@edu.hse.ru with pass 12345678
Then I close browser

我的步骤

using System.Drawing;
using applitools;
using applitools.Selenium;
using Lms.Helpers;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using TechTalk.SpecFlow;
using NUnit.Framework;
using Configuration = applitools.Selenium.Configuration;

namespace Lms.Steps
{
    [TestFixture]
    [Binding]
    public class LoginInLmssteps
    {
        private IWebDriver driver;
        private LoginHelper loginHelper;
        private Eyes eyes;
        private EyesRunner runner;

        private string Url => "https://lms.hse.ru/";

        [Before]
        [SetUp]
        public void BeforeEach()
        {
            Configuration config = new Configuration();
            config.SetApiKey("my_key");
            config.SetBatch(new BatchInfo("LMS Batch"));
            config.Addbrowser(800,600,browserType.CHROME);

            runner = new ClassicRunner();

            eyes = new Eyes(runner);

            eyes.SetConfiguration(config);
        }

        [When(@"I open Web Site")]
        public void WhenIOpenWebSite()
        {
            driver = new ChromeDriver();
            driver.Url = Url;
        }
        
        [When(@"I login as user (.*) with pass (.*)")]
        public void WhenILoginAsUserWithPass(string username,string password)
        {
            eyes.Open(driver,"LMS","Login test",new Size(800,600));
            eyes.CheckWindow("Login Page");

            loginHelper.Login(username,password);

            eyes.CloseAsync();
        }
        
        [Then(@"I close browser")]
        public void ThenIClosebrowser()
        {
            driver.Quit();
            driver = null;
        }

        [TearDown]
        public void AfterEach()
        {
            // If the test was aborted before eyes.close was called,ends the test as aborted.
            eyes.AbortIfNotClosed();

            //Wait and collect all test results
            TestResultsSummary allTestResults = runner.GetAllTestResults();
        }
    }
}

也就是说,我已经在设置阶段发现了错误

感谢您的帮助!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

java selenium 打开多个浏览器执行的问题

java selenium 打开多个浏览器执行的问题

想问以下各位 我用selenium 做爬虫,然后模拟登陆  如何打开多个浏览器同时执行,并且互不影响呢?还有就是遇到 那种发送短信验证码的怎么处理? 不是图形验证码?

org.openqa.selenium.htmlunit.HtmlUnitWebElement的实例源码

org.openqa.selenium.htmlunit.HtmlUnitWebElement的实例源码

项目:ats-framework    文件:HiddenHtmlMultiSelectList.java   
/**
 * unselect a value
 *
 * @param value the value to unselect
 */
@Override
@PublicAtsApi
public void unsetValue(
                        String value ) {

    new HiddenHtmlElementState(this).waitToBecomeExisting();

    HtmlUnitWebElement selectElement = HiddenHtmlElementLocator.findElement(this);
    List<WebElement> optionElements = selectElement.findElements(By.tagName("option"));
    for (WebElement el : optionElements) {
        if (el.getText().equals(value)) {
            if (el.isSelected()) {
                ((HtmlUnitWebElement) el).click();

                UiEngineUtilities.sleep();
            }
            return;
        }
    }
    throw new SeleniumOperationException("Option with label '" + value + "' not found. ("
                                         + this.toString() + ")");
}
项目:ats-framework    文件:HiddenHtmlMultiSelectList.java   
/**
 * @return the selected value
 */
@Override
@PublicAtsApi
public String[] getValues() {

    new HiddenHtmlElementState(this).waitToBecomeExisting();

    HtmlUnitWebElement selectElement = HiddenHtmlElementLocator.findElement(this);
    List<String> values = new ArrayList<String>();
    List<WebElement> optionElements = selectElement.findElements(By.tagName("option"));
    for (WebElement element : optionElements) {
        if (element.isSelected()) {
            values.add(element.getText());
        }
    }
    if (values.isEmpty()) {

        throw new SeleniumOperationException("There is no selected 'option' in " + this.toString());
    }
    return values.toArray(new String[0]);
}
项目:ats-framework    文件:HiddenHtmlCheckBox.java   
/**
 * Check the check Box
 */
@Override
@PublicAtsApi
public void check() {

    new HiddenHtmlElementState(this).waitToBecomeExisting();

    HtmlUnitWebElement element = HiddenHtmlElementLocator.findElement(this);
    if (!element.isEnabled()) {
        throw new UnsupportedOperationException("You may not check a disabled element." + toString());
    }
    if (!element.isSelected()) {

        element.click();
    }

    UiEngineUtilities.sleep();
}
项目:ats-framework    文件:HiddenHtmlCheckBox.java   
/**
 * Uncheck the check Box
 */
@Override
@PublicAtsApi
public void unCheck() {

    new HiddenHtmlElementState(this).waitToBecomeExisting();

    HtmlUnitWebElement element = HiddenHtmlElementLocator.findElement(this);
    if (!element.isEnabled()) {
        throw new UnsupportedOperationException("You may not uncheck a disabled element." + toString());
    }
    if (element.isSelected()) {

        element.click();
    }

    UiEngineUtilities.sleep();
}
项目:ats-framework    文件:HiddenHtmlRadioList.java   
/**
 * Select radio button
 *
 * @param value of the button to select
 */
@PublicAtsApi
public void select(
                    String value ) {

    HtmlUnitWebElement element = HiddenHtmlElementLocator.findElement(this,"[@value='" + value + "']",true);
    if (!element.isEnabled()) {

        throw new UnsupportedOperationException("You may not select a disabled element." + toString());
    }
    element.click();

    UiEngineUtilities.sleep();
}
项目:ats-framework    文件:HiddenHtmlSingleSelectList.java   
/**
 * set the single selection value
 *
 * @param value the value to select
 */
@Override
@PublicAtsApi
public void setValue(
                      String value ) {

    new HiddenHtmlElementState(this).waitToBecomeExisting();

    HtmlUnitWebElement selectElement = HiddenHtmlElementLocator.findElement(this);
    List<WebElement> optionElements = selectElement.findElements(By.tagName("option"));
    for (WebElement el : optionElements) {
        if (el.getText().equals(value)) {
            ((HtmlUnitWebElement) el).click();
            UiEngineUtilities.sleep();
            return;
        }
    }

    throw new SeleniumOperationException("Option with label '" + value + "' not found. ("
                                         + this.toString() + ")");
}
项目:ats-framework    文件:HiddenHtmlSingleSelectList.java   
/**
 * @return the single selection value
 */
@Override
@PublicAtsApi
public String getValue() {

    new HiddenHtmlElementState(this).waitToBecomeExisting();

    HtmlUnitWebElement selectElement = HiddenHtmlElementLocator.findElement(this);
    List<WebElement> optionElements = selectElement.findElements(By.tagName("option"));
    for (WebElement element : optionElements) {
        if (element.isSelected()) {
            return element.getText();
        }
    }
    throw new SeleniumOperationException("There is no selected 'option' in " + this.toString());
}
项目:ats-framework    文件:HiddenHtmlSingleSelectList.java   
/**
 * @return  a list with all possible selection values
 */
@Override
@PublicAtsApi
public List<String> getAllPossibleValues() {

    List<String> values = new ArrayList<String>();
    new HiddenHtmlElementState(this).waitToBecomeExisting();

    HtmlUnitWebElement selectElement = HiddenHtmlElementLocator.findElement(this);
    List<WebElement> optionElements = selectElement.findElements(By.tagName("option"));

    if (optionElements.size() > 0) {
        for (WebElement element : optionElements) {
            values.add(element.getText());
        }
        return values;

    }
    throw new SeleniumOperationException("There is no selectable 'option' in " + this.toString());
}
项目:redsniff    文件:SeleniumController.java   
private HtmlElement getHtmlUnitElement(HtmlUnitWebElement webElement){
    try {
        boolean changed=false;
        Field field = HtmlUnitWebElement.class.getDeclaredField("element");
        if (!field.isAccessible()) {

            field.setAccessible(true);
            changed=true;
        }

        HtmlElement htmlElement = (HtmlElement)field.get(webElement);
        if(changed)
            field.setAccessible(false);
        return htmlElement;
    } catch (Exception e) {
        throw new Error(e.getMessage(),e);
    }
}
项目:ats-framework    文件:HiddenHtmlMultiSelectList.java   
/**
 * select a value
 *
 * @param value the value to select
 */
@Override
@PublicAtsApi
public void setValue(
                      String value ) {

    new HiddenHtmlElementState(this).waitToBecomeExisting();

    HtmlUnitWebElement selectElement = HiddenHtmlElementLocator.findElement(this);
    if (selectElement.getAttribute("multiple") == null) {
        throw new SeleniumOperationException("Not a multi-select. You may only add a selection to a select that supports multiple selections. ("
                                             + this.toString() + ")");
    }

    List<WebElement> optionElements = selectElement.findElements(By.tagName("option"));
    for (WebElement el : optionElements) {
        if (el.getText().equals(value)) {
            if (!el.isSelected()) {
                ((HtmlUnitWebElement) el).click();

                UiEngineUtilities.sleep();
            }
            return;
        }
    }

    throw new SeleniumOperationException("Option with label '" + value + "' not found. ("
                                         + this.toString() + ")");
}
项目:ats-framework    文件:HiddenHtmlTextArea.java   
/**
 * Set the Text Area value
 *
 * @param value
 */
@Override
@PublicAtsApi
public void setValue(
                      String value ) {

    new HiddenHtmlElementState(this).waitToBecomeExisting();

    HtmlUnitWebElement element = HiddenHtmlElementLocator.findElement(this);
    element.clear();
    element.sendKeys(value);

    UiEngineUtilities.sleep();
}
项目:ats-framework    文件:HiddenHtmlTextArea.java   
/**
 * Append text to the current content of a Text Area
 * 
 * @param value
 */
@Override
@PublicAtsApi
public void appendValue(
                         String value ) {

    new HiddenHtmlElementState(this).waitToBecomeExisting();

    HtmlUnitWebElement element = HiddenHtmlElementLocator.findElement(this);
    element.sendKeys(value);

    UiEngineUtilities.sleep();
}
项目:ats-framework    文件:HiddenHtmlTextBox.java   
/**
 * Append text to the current content of a Text Box
 * 
 * @param value
 */
@PublicAtsApi
public void appendValue(
                         String value ) {

    new HiddenHtmlElementState(this).waitToBecomeExisting();

    HtmlUnitWebElement element = HiddenHtmlElementLocator.findElement(this);
    element.sendKeys(value);

    UiEngineUtilities.sleep();
}
项目:ats-framework    文件:HiddenHtmlTextBox.java   
/**
 * Set the Text Box value
 *
 * @param value
 */
@Override
@PublicAtsApi
public void setValue(
                      String value ) {

    new HiddenHtmlElementState(this).waitToBecomeExisting();

    HtmlUnitWebElement element = HiddenHtmlElementLocator.findElement(this);
    element.clear();
    element.sendKeys(value);

    UiEngineUtilities.sleep();
}
项目:ats-framework    文件:HiddenHtmlElementState.java   
@Override
@PublicAtsApi
public boolean isElementEnabled() {

    try {
        HtmlUnitWebElement element = HiddenHtmlElementLocator.findElement(this.element);
        return element.isEnabled();
    } catch (ElementNotFoundException nsee) {
        return false;
    }
}
项目:ats-framework    文件:HiddenHtmlElementState.java   
/**
 * Check whether the element is displayed or not
 *
 * @return <code>true</code> if the element is displayed
 */
@Override
@PublicAtsApi
public boolean isElementdisplayed() {

    try {
        HtmlUnitWebElement element = HiddenHtmlElementLocator.findElement(this.element);
        return element.isdisplayed();
    } catch (ElementNotFoundException nsee) {
        return false;
    }
}
项目:Cucumber-meets-Selenium    文件:BootsFacesTestDSL.java   
@Then("^I can download BootsFaces$")
public void then_I_can_download_BootsFaces() throws Throwable {
    WebElement greenButton = driver.findElement(By.className("btn-success"));
    HtmlUnitWebElement innerSpan = (HtmlUnitWebElement) greenButton.findElement(By.tagName("span"));
    Assert.assertNotNull(innerSpan);
    System.out.println("Download button found");
}
项目:redsniff    文件:SeleniumController.java   
@Override
    public void tab(WebElement element) {
//XXX shame we have to do it like this..
        if(element instanceof HtmlUnitWebElement)
            tabOnHtmlUnitElement(element);
        else {
            blurUsingJavascript(element);
            //blurByTypingTabKey(element);
        }
    }
项目:ats-framework    文件:HiddenHtmlElementLocator.java   
public static HtmlUnitWebElement findElement( UiElement uiElement,String xpathSuffix,boolean verbose ) {

        HiddenbrowserDriver browserDriver = (HiddenbrowserDriver) uiElement.getUiDriver();
        WebDriver webDriver = (WebDriver) browserDriver.getInternalObject(InternalObjectsEnum.WebDriver.name());
        HtmlNavigator.getInstance().navigatetoFrame(webDriver,uiElement);

        String xpath = uiElement.getElementProperties()
                                .getInternalProperty(HtmlElementLocatorBuilder.PROPERTY_ELEMENT_LOCATOR);

        String css = uiElement.getElementProperty("_css");

        if (xpathSuffix != null) {
            xpath += xpathSuffix;
        }

        List<WebElement> elements = null;

        if (!StringUtils.isNullOrEmpty(css)) {
            elements = webDriver.findElements(By.cssSelector(css));
        } else {
            elements = webDriver.findElements(By.xpath(xpath));
        }

        if (elements.size() == 0) {

            throw new ElementNotFoundException(uiElement.toString() + " not found.");
        } else if (elements.size() > 1) {
            if (verbose) {

                log.warn("More than one HTML elements were found having properties " + uiElement.toString()
                         + ".Only the first HTML element will be used.");

            }
        }
        HtmlUnitWebElement element = (HtmlUnitWebElement) elements.get(0);
        if (verbose) {

            log.info("Found element: " + element.toString());
        }
        return element;
    }
项目:redsniff    文件:SeleniumController.java   
private void tabOnHtmlUnitElement(WebElement element) {
    getHtmlUnitElement((HtmlUnitWebElement) element).blur();
}
项目:ats-framework    文件:HiddenHtmlElementLocator.java   
public static HtmlUnitWebElement findElement( UiElement uiElement ) {

        return findElement(uiElement,null,true);
    }

Python selenium 在测试之间共享第二个浏览器

Python selenium 在测试之间共享第二个浏览器

如何解决Python selenium 在测试之间共享第二个浏览器?

我对硒很陌生,可能做错了什么。请修理我!

我正在创建一些 E2E 测试,其中一部分需要第二个帐户。 每次打开新浏览器时,我都必须进行登录程序,这需要时间。 所以,我决定在测试之间保持第二个浏览器打开并重复使用它。

但是我无法将新创建的 selenium 对象传递给第二个测试。我做错了什么?

class RunTest(unittest.TestCase): 
    @classmethod
    def setUpClass(self):
        #main browser that I always use
        self.driver = webdriver.Chrome(...)

    def init_second_driver(self):
        #second browser that Could be used by some tests
        self.second_driver = webdriver.Chrome(...)

    def test_case1(self):
        if not self.second_driver:
            self.init_second_driver() 
        #some tests for case 1

    def test_case2(self):
        if not self.second_driver: #this check always fails! WHY?
            self.init_second_driver()
        #some tests for case 2


提前致谢

解决方法

每次创建 chromedriver 对象时,默认选项都是创建新的 Chrome 配置文件。将个人资料视为您本地的 cookie 存储和 chache。

你希望这发生。 Selenium 设计用于在没有历史记录的情况下每次测试和登录,确保您的测试始终从相同状态开始(未登录且没有 cookie)。

如果您有大量测试并希望您的套件运行得更快,请考虑并行运行测试。

现在,如果您想尝试在测试之间共享状态(即保持登录状态),您可以使用以下选项/标签指示 chrome 重用配置文件:

options = webdriver.ChromeOptions() 
options.add_argument(''--user-data-dir=C:/Path/To/Your/Testing/User Data'')
driver  = webdriver.Chrome(options=options)

这应该消除了您的状态对第二个浏览器的需求。

关于使用Webinator + Selenium,SpecFlow和NUnit的多个浏览器测试浏览器测试用例的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Applitools + Specflow + Selenium + C#、java selenium 打开多个浏览器执行的问题、org.openqa.selenium.htmlunit.HtmlUnitWebElement的实例源码、Python selenium 在测试之间共享第二个浏览器的相关信息,请在本站寻找。

本文标签: