在这篇文章中,我们将带领您了解使用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的多个浏览器测试(浏览器测试用例)
- Applitools + Specflow + Selenium + C#
- java selenium 打开多个浏览器执行的问题
- org.openqa.selenium.htmlunit.HtmlUnitWebElement的实例源码
- Python selenium 在测试之间共享第二个浏览器
使用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#?
我正在寻求帮助,我已经绝望了。
我使用 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 打开多个浏览器执行的问题
想问以下各位 我用selenium 做爬虫,然后模拟登陆 如何打开多个浏览器同时执行,并且互不影响呢?还有就是遇到 那种发送短信验证码的怎么处理? 不是图形验证码?
org.openqa.selenium.htmlunit.HtmlUnitWebElement的实例源码
/** * 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() + ")"); }
/** * @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]); }
/** * 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(); }
/** * 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(); }
/** * 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(); }
/** * 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() + ")"); }
/** * @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()); }
/** * @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()); }
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); } }
/** * 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() + ")"); }
/** * 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(); }
/** * 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(); }
/** * 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(); }
/** * 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(); }
@Override @PublicAtsApi public boolean isElementEnabled() { try { HtmlUnitWebElement element = HiddenHtmlElementLocator.findElement(this.element); return element.isEnabled(); } catch (ElementNotFoundException nsee) { return false; } }
/** * 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; } }
@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"); }
@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); } }
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; }
private void tabOnHtmlUnitElement(WebElement element) { getHtmlUnitElement((HtmlUnitWebElement) element).blur(); }
public static HtmlUnitWebElement findElement( UiElement uiElement ) { return findElement(uiElement,null,true); }
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 在测试之间共享第二个浏览器的相关信息,请在本站寻找。
本文标签: