To test some of the legacy pages I need to execute few test cases against IE8. These same testcases run efficiently against IE10/11, FF, Chrome without any issue.
public void TypePassword(string password)
{
var element = new WebDriverWait(Driver, TimeSpan.FromSeconds(10)).Until(
ExpectedConditions.ElementIsVisible(By.XPath("//input[#id='txtPassword']")));
//I also tried with just id and cssselector
element.Clear();
element.SendKeys(password);
}
I also tried
public void TypePassword(string password)
{
Password.Clear();
Password.SendKeys(password);
}
Interestingly,
public void TypeUsername(string username)
{
Username.Clear();
Username.SendKeys(username);
}
always work without any issue.
The IE driver configuration
var options = new InternetExplorerOptions { EnableNativeEvents = false};
options.AddAdditionalCapability("EnsureCleanSession", true);
Driver = new InternetExplorerDriver(options);
Seems like I am missing some configuration which is specific to IE8.
Also, confirmed zoom level and protected mode set up
Have you tried JavascriptExecutor ?
var element = new WebDriverWait(Driver, TimeSpan.FromSeconds(10)).Until(ExpectedConditions.ElementIsVisible(By.XPath("//input[#id='txtPassword']")));
((JavascriptExecutor)Driver).executeScript("arguments[0].value='"+password+"'", element);
It is difficult to find the element exists,
so u can go for the element count >1 using do while loop,
do
{
Thread.Sleep(500);
}while(driver.FindElements(By.Id("IDNAME")).Count>0);
Unless until, the count of the element gets, this do loop will execute and wait for the element to visible also
Related
I've been trying to implement headless browser to my tests and I'm getting an error message that shows me this: "Unable to locate element: {"method":"id","selector":"my_id"}". This is the code that I'm working with:
[TestFixture]
class ClientesSystemTest
{
private ChromeOptions options;
private NewClientesPage page;
private IWebDriver driver;
public ClientesSystemTest()
{
options = new ChromeOptions();
options.AddArgument("--headless");
driver = new ChromeDriver(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), options);
page = new NewClientesPage(driver);
}
[Test]
public void CadastraCliente()
{
page.Visita();
page.Cadastra("Paulo", "Guedes", "00870021087", "Rua abcdwxyz, 14", 15);
driver.Close();
}
}
and this is the Cadastra method.:
public void Cadastra(string nome, string sobrenome, string cpf, string endereco, int idade)
{
IWebElement nomeCliente = driver.FindElement(By.Id("Nome"));
IWebElement sobrenomeCliente = driver.FindElement(By.Id("Sobrenome"));
IWebElement cpfCliente = driver.FindElement(By.Id("CPF"));
IWebElement enderecoCliente = driver.FindElement(By.Id("Endereco"));
IWebElement idadeCliente = driver.FindElement(By.Id("Idade"));
IWebElement estadoCivilCliente = driver.FindElement(By.Name("EstadoCivil"));
driver.FindElement(By.CssSelector("[value=Divorciado]")).Click();
nomeCliente.SendKeys(nome);
sobrenomeCliente.SendKeys(sobrenome);
cpfCliente.SendKeys(cpf);
enderecoCliente.SendKeys(endereco);
idadeCliente.SendKeys(idade.ToString());
nomeCliente.Submit();
}
I've tried everything by this point. The test runs normally without the headless feature. Does anyone have a solution for this error? Thanks.
My guess would be that your site shows different elements depending on the browser resolution. Typically the headless browser is a smaller setting so I'd make sure it's set to the same size you use when you test non-headless.
I'm new to Selenium, TestNG and Stackoverflow.
After sendkeys, I want to do some validation. If the validation is true, then the assert is true. I know this is not the right way to write the Assert method.
WebDriver driver;
#DataProvider(name= "testdata")
public static Object[][] loginData(){
return new Object[][]{{"username1", "123"}, {"username2", "4211"}};
}
#BeforeTest
public void configure(){
....
}
#Test(dataProvider = "testdata")
public void testmethod(String uname, String password){
WebElement usernameTextbox = driver.findElement(By.id("username"));
usernameTextbox.sendKeys(uname);
WebElement passwordTextbox = driver.findElement(By.id("username"));
passwordTextbox.sendKeys(uname);
driver.manage().timeouts().implicitlyWait(2, TimeUnit.MICROSECONDS);
Assert.assertTrue(if(usernameTextbox.contains("[a-zA-Z0-9]+") && passwordTextbox.contains("[0-9]+") == true));
PS: Any inputs will be appreciated.
Try implementing explicit wait in Your code. What that mean, is that You wait for some condition to be set, here is example how to manage this:
But my suggestion is that You assert if there are some error messages (labels, span, or whatever that appears saying something is wrong with email or pass)
So here is how I would do it:
WebDriver driver;
#DataProvider(name= "testdata")
public static Object[][] loginData(){
return new Object[][]{{"username1", "123"}, {"username2", "4211"}};
}
#BeforeTest
public void configure(){
driver = new WebDriver();
driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS); //this is wait which will wait until driver throws exception (that is not found eg."NoSuchElementException")
}
#Test(dataProvider = "testdata")
public void testmethod(String uname, String password){
WebElement usernameTextbox = driver.findElement(By.id("usernameID"));
usernameTextbox.sendKeys(uname);
WebElement passwordTextbox = driver.findElement(By.id("passwordID"));
passwordTextbox.sendKeys(password); //here is where You've sent wrong param
// if You know You will get error label or something use this
WebDriverWait wait = new WebDriverWait(driver, 10); //wait for max 10 sec, and wait for error element defined bellow
WebElement errorElement = wait.until(ExpectedConditions. presenceOfElementLocated(By.id("someErrorElementId"))); //(or ExpectedConditions.textToBePresentInElement(..)), see what better suites You
// If You're expecting error than use this assert
Assert.assertTrue(errorElement.isDisplayed(),"There should be error message!")
// but If You're expecting that there should not be any error than use this assert
Assert.assertFalse(errorElement.isDisplayed(),"There shouldn't be no error messages!")
}
tweak this code, but basicaly this is the logic.
So to try to answer the original question your code could look like below:
1. Using the getAttribute("value")
2. Building the assertion - you don't need to wrap the condition in an if as the contains() function will return true or false for you:
WebDriver driver;
#DataProvider(name= "testdata")
public static Object[][] loginData(){
return new Object[][]{{"username1", "123"}, {"username2", "4211"}};
}
#BeforeTest
public void configure(){
....
}
#Test(dataProvider = "testdata")
public void testmethod(String uname, String password){
WebElement usernameTextbox = driver.findElement(By.id("username"));
usernameTextbox.sendKeys(uname);
WebElement passwordTextbox = driver.findElement(By.id("username"));
passwordTextbox.sendKeys(uname);
driver.manage().timeouts().implicitlyWait(2, TimeUnit.MICROSECONDS);
Assert.assertTrue(usernameTextbox.getAttribute("value").contains("[a-zA-Z0-9]+") && passwordTextbox.getAttribute("value").contains("[0-9]+"));
HTH
As per your question just after invoking sendKeys() you want to do some assertions.
At this point it is worth to mention that when you invoke sendKeys() on a <input> node/tag/field the HTML DOM is not immediately updated with the value / characters which you have just entered in majority of the cases (of-coarse there are exceptional cases). Moving forward when you invoke click() or submit()on a <button> or similar <input> element, the associated onclick event of this <input> element updates the HTML DOM and the value / characters previously sent through sendKeys() are adjusted within the HTML DOM.
Unless the value / characters are not accommodated within the DOM Tree Selenium won't be able to interact with them.
As per your code block, you have populated the passwordTextbox field with the String value of uname as follows :
passwordTextbox.sendKeys(uname);
This value / characterset is still volatile and editable (can be overwritten/cleared/deleted) as follows :
passwordTextbox.clear();
passwordTextbox.sendKeys("Emma E");
Essentially, Assert methods can be invoked on text those are part of the HTML DOM. As an example you can use the following Assert for a Page Heading, Table Heading, etc :
Assert.assertTrue(if(pageHeaderElement.contains("[a-zA-Z0-9]+") && tableHeaderElement.contains("[0-9]+") == true));
how is possible to find the xpath for an angularJs element? for instance i discovered that all links in my page have the same xpath due to the repeated items in angularJs -->
.//*[#id='div_1_1_1_2']/div/div[1]/div[2]/div[2]/div/div[2]/div[1]/div/div[2]/a
but i have 10 of element , they are differente for text, so i tried with `"
so i tried with contains but it never find it
.//[#id='div_1_1_1_2']/div/div[1]/div[2]/div[2]/div/div[2]/div[1]/div/div[2]/a[contains(#aria-label='Creazione Prodotto')]"`
i use selenium, junit4 , firefox webDriver
this is my code
public class PB01_TTT {
private WebDriver driver;
private String baseUrl;
private boolean acceptNextAlert = true;
private StringBuffer verificationErrors = new StringBuffer();
WebElement element;
#Before()
public void setUp() throws Exception {
FirefoxProfile fxProfile = new FirefoxProfile();
fxProfile.setPreference("browser.download.folderList", 2);
fxProfile.setPreference("browser.download.manager.showWhenStarting", false);
fxProfile.setPreference("browser.helperApps.alwaysAsk.force", false);
fxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk",
"application/pdf, application/x-pdf, application/octet-stream");
fxProfile.setPreference("pdfjs.disabled", true);
driver = new FirefoxDriver(fxProfile);
baseUrl = "https://w8aon2bpm.replynet.prv:9443";
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
#Test
public void testPBO1TTT() throws Exception {
driver.get(baseUrl + "/ProcessPortal/login.jsp");
// driver.get(baseUrl + "/ProcessPortal/dashboards/SYSRP/RESPONSIVE_WORK");
driver.findElement(By.id("username")).clear();
driver.findElement(By.id("username")).sendKeys("user");
driver.findElement(By.id("password")).clear();
driver.findElement(By.id("password")).sendKeys("password");
String columnToDisplay=driver.findElements(By.xpath(".//*[#id='div_1_1_1_2']/div/div[1]/div[2]/div[2]/div/div[2]/div[1]/div/div[2]/a[contains(#aria-label='Creazione Prodotto')]"));
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
element = (WebElement) driver.findElements(By.xpath(columnToDisplayXpath));
Assert.assertNotNull(element);
it always return me a notFoundElement, any suggestions ?
Thank you
If you have 10 links, then there is a high chance they are different in a way even if the path is the same, in this case you need to construct an path based on the thing that is different.
For example: use href, text or other any part that differs
//a[contains(#href, 'part_of_href')]
//a[contains(text(), 'part_of_text')]
//a[#title='title']
//a[contains(#aria-label='Creazione Prodotto')]
If you need any help in getting the selector please add the html section of the links, you can change the url if needed.
Tip: avoid using absolute xpaths and attributes that do not suggest anything and they can change like: .//*[#id='div_1_1_1_2']/div/div[1]/div[2]/div[2]/div/div[2]/div[1]/div/div[2]/a[contains(#aria-label='Creazione Prodotto')]"
This will give you a lot of work in the future.
I have 2 methods in my testcase.
method 1 :
[TestMethod]
public void AddUser()
{
firefox = new OpenQA.Selenium.Firefox.FirefoxDriver();
firefox.Navigate().GoToUrl("http://<code><code>domain</code></code>:44220/learn-language-online/");
firefox.FindElement(By.LinkText("Sign In")).Click();
firefox.FindElement(By.CssSelector("span.watermarkify-watermark-inner")).Click();
firefox.FindElement(By.Id("Username")).Clear();
firefox.FindElement(By.Id("Username")).SendKeys("rachana#prakashinfotech.com");
firefox.FindElement(By.Id("Password")).Clear();
firefox.FindElement(By.Id("Password")).SendKeys("123456");
firefox.FindElement(By.XPath("(//a[contains(text(),'Sign In')])[2]")).Click();
firefox.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(90));
OpenQA.Selenium.Interactions.Actions builder = new OpenQA.Selenium.Interactions.Actions(firefox);
IWebElement elem = firefox.FindElement(By.ClassName("icon"));
builder.MoveToElement(elem).Build().Perform();
firefox.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(40));
firefox.FindElement(By.LinkText("Manage Users")).Click();
firefox.FindElement(By.Id("FirstName")).Clear();
firefox.FindElement(By.Id("FirstName")).SendKeys("Kashyap");
firefox.FindElement(By.Id("LastName")).Clear();
firefox.FindElement(By.Id("LastName")).SendKeys("Khanna");
firefox.FindElement(By.Id("Password")).Clear();
firefox.FindElement(By.Id("Password")).SendKeys("123");
firefox.FindElement(By.Id("ConfirmPassword")).Clear();
firefox.FindElement(By.Id("ConfirmPassword")).SendKeys("123");
firefox.FindElement(By.Id("Email")).Clear();
firefox.FindElement(By.Id("Email")).SendKeys("kashyap#gmail.com");
new SelectElement(firefox.FindElement(By.Id("Languages"))).SelectByText("India");
new SelectElement(firefox.FindElement(By.Id("DifficultyLevels"))).SelectByText("Level 1");
new SelectElement(firefox.FindElement(By.Id("MaturityLevels"))).SelectByText("Everyone");
firefox.FindElement(By.XPath("//a[2]/span")).Click();
}
method 2 :
[TestMethod]
public void AssignCourse()
{
firefox = new OpenQA.Selenium.Firefox.FirefoxDriver();
firefox.Navigate().GoToUrl("http://<code>domain</code>:44220/Home/Index");
firefox.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(90));
OpenQA.Selenium.Interactions.Actions builder = new OpenQA.Selenium.Interactions.Actions(firefox);
IWebElement elem = firefox.FindElement(By.ClassName("icon"));
builder.MoveToElement(elem).Build().Perform();
firefox.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(90));
firefox.FindElement(By.LinkText("Manage Users")).Click();
firefox.FindElement(By.XPath("//div[#id='divUser_84700']/div[2]/div/div/a[2]")).Click();
firefox.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(120));
firefox.FindElement(By.XPath("(//img[#alt='Delete'])[5]")).Click();
firefox.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(80));
firefox.FindElement(By.XPath("//a[#id='addCourses']/span")).Click();
firefox.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(80));
firefox.FindElement(By.CssSelector("li.class_73.courseItem > a > span.detail")).Click();
firefox.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(40));
firefox.FindElement(By.CssSelector("li.class_87.courseItem > a > span.detail")).Click();
firefox.FindElement(By.Id("btnAddCourse")).Click();
}
now when my 1st method get tested and it moves to 2nd method session of uesrid and password not get maintained and because of that i am not able to navigate my url to http://domain:44220/Home/Index. so how to solve the issue of authentication.
Specify firefox = new OpenQA.Selenium.Firefox.FirefoxDriver();
in a setup method may be in #BeforeTest, it makesures that there is only one instance of firefoxdriver is running for the entire set of tests.
You have at least two options.
You can use cookie:
Cookie ck = new Cookie("name", "value");
driver.manage().addCookie(ck);
(code in java)
Operation on cookie - http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/Cookie.html
You can use Page Object Pattern it is best practice to create test code. You can then call method to log in from #Before or #BeforeTest annotation etc. I encourage you to reaad about Page Object Pattern because it helps writing maintanable, and cleaner test code
WebDriver creates a new Firefox profile every time you launch the browser so any cookies or whatever session parameters are lost. Meaning, you have to log in again. That would be:
private WebDriver firefox;
private void LogIn()
{
firefox = new OpenQA.Selenium.Firefox.FirefoxDriver();
firefox.Navigate().GoToUrl("http://<code><code>domain</code></code>:44220/learn-language-online/");
firefox.FindElement(By.LinkText("Sign In")).Click();
firefox.FindElement(By.CssSelector("span.watermarkify-watermark-inner")).Click();
firefox.FindElement(By.Id("Username")).Clear();
firefox.FindElement(By.Id("Username")).SendKeys("rachana#prakashinfotech.com");
firefox.FindElement(By.Id("Password")).Clear();
firefox.FindElement(By.Id("Password")).SendKeys("123456");
firefox.FindElement(By.XPath("(//a[contains(text(),'Sign In')])[2]")).Click();
}
[TestMethod]
public void AddUser()
{
LogIn();
firefox.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(90));
OpenQA.Selenium.Interactions.Actions builder = new OpenQA.Selenium.Interactions.Actions(firefox);
IWebElement elem = firefox.FindElement(By.ClassName("icon"));
builder.MoveToElement(elem).Build().Perform();
firefox.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(40));
firefox.FindElement(By.LinkText("Manage Users")).Click();
firefox.FindElement(By.Id("FirstName")).Clear();
firefox.FindElement(By.Id("FirstName")).SendKeys("Kashyap");
firefox.FindElement(By.Id("LastName")).Clear();
firefox.FindElement(By.Id("LastName")).SendKeys("Khanna");
firefox.FindElement(By.Id("Password")).Clear();
firefox.FindElement(By.Id("Password")).SendKeys("123");
firefox.FindElement(By.Id("ConfirmPassword")).Clear();
firefox.FindElement(By.Id("ConfirmPassword")).SendKeys("123");
firefox.FindElement(By.Id("Email")).Clear();
firefox.FindElement(By.Id("Email")).SendKeys("kashyap#gmail.com");
new SelectElement(firefox.FindElement(By.Id("Languages"))).SelectByText("India");
new SelectElement(firefox.FindElement(By.Id("DifficultyLevels"))).SelectByText("Level 1");
new SelectElement(firefox.FindElement(By.Id("MaturityLevels"))).SelectByText("Everyone");
firefox.FindElement(By.XPath("//a[2]/span")).Click();
}
[TestMethod]
public void AssignCourse()
{
LogIn();
firefox.Navigate().GoToUrl("http://<code>domain</code>:44220/Home/Index");
firefox.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(90));
OpenQA.Selenium.Interactions.Actions builder = new OpenQA.Selenium.Interactions.Actions(firefox);
IWebElement elem = firefox.FindElement(By.ClassName("icon"));
builder.MoveToElement(elem).Build().Perform();
firefox.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(90));
firefox.FindElement(By.LinkText("Manage Users")).Click();
firefox.FindElement(By.XPath("//div[#id='divUser_84700']/div[2]/div/div/a[2]")).Click();
firefox.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(120));
firefox.FindElement(By.XPath("(//img[#alt='Delete'])[5]")).Click();
firefox.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(80));
firefox.FindElement(By.XPath("//a[#id='addCourses']/span")).Click();
firefox.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(80));
firefox.FindElement(By.CssSelector("li.class_73.courseItem > a > span.detail")).Click();
firefox.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(40));
firefox.FindElement(By.CssSelector("li.class_87.courseItem > a > span.detail")).Click();
firefox.FindElement(By.Id("btnAddCourse")).Click();
}
Is there a way in the latest version of Selenium DotNet Webdriver (2.22.0) to check to see if an element is visible before clicking/interacting with it?
The only way I've found is to try to handle the ElementNotVisible exception that occurs when you try to send keys, or click on it. Unfortunately this only occurs after an attempt to interact with the element has been made. I'm using a recursive function to find elements with a certain value, and some of these elements are only visible in certain scenarios (but their html is still there no matter what, so they can be found).
It's my understanding that the RenderedWebElement class is deprecated as well other variants. So no casting to that.
Thanks.
For Java there is isDisplayed() on the RemoteWebElement - as well is isEnabled()
In C#, there is a Displayed & Enabled property.
Both must be true for an element to be on the page and visible to a user.
In the case of "html is still there no matter what, so they can be found", simply check BOTH isDisplayed (Java) / Displayed (C#) AND isEnabled (Java) / Enabled (C#).
Example, in C#:
public void Test()
{
IWebDriver driver = new FirefoxDriver();
IWebElement element = null;
if (TryFindElement(By.CssSelector("div.logintextbox"), out element)
{
bool visible = IsElementVisible(element);
if (visible)
{
// do something
}
}
}
public bool TryFindElement(By by, out IWebElement element)
{
try
{
element = driver.FindElement(by);
}
catch (NoSuchElementException ex)
{
return false;
}
return true;
}
public bool IsElementVisible(IWebElement element)
{
return element.Displayed && element.Enabled;
}
It seems the current answer to this question is outdated: With WebDriver 3.13 both the Displayed and Enabled properties will return true as long as the element exists on the page, even if it is outside of the viewport. The following C# code works for WebDriver 3.13 (from this StackOverflow answer):
{
return (bool)((IJavaScriptExecutor)Driver).ExecuteScript(#"
var element = arguments[0];
var boundingBox = element.getBoundingClientRect();
var cx = boundingBox.left + boundingBox.width/2, cy = boundingBox.top + boundingBox.height/2;
return !!document.elementFromPoint(cx, cy);
", element);
}
There is a simple way to do that, follow below:
public bool ElementDisplayed(By locator)
{
new WebDriverWait(driver, TimeSpan.FromSeconds(timeOut)).Until(condition: ExpectedConditions.PresenceOfAllElementsLocatedBy(locator));
return driver.FindElement(locator).Displayed ;
}
You can use the following:
WebDriver web = new FirefoxDriver(;
String visibility = web.findElement(By.xpath("//your xpath")).getCssValue("display");