Webdriver: ошибка компиляции в пользовательских созданных классах обертки веб-элементов и драйверов
-
21-12-2019 - |
Вопрос
// Я хочу использовать свои собственные пользовательские элементы вместо веб-элементов определенного селена // Мне нравится Weafelement и WebDriver и т. Д. Итак, я создал следующие пользовательские классы обертки: -
//custom webdriver wrapper
package org.rsf.wrapper.driver;
import org.openqa.selenium.WebDriver;
public interface RsfWebDriver extends WebDriver{
}
//custom webelement wrapper
package org.rsf.wrapper.element;
import org.openqa.selenium.WebElement;
public interface RsfElement extends WebElement{
}
.
// Теперь я звоню в мои классы обертки на следующем коду PageObject. Но это дает Error.pls // Помогите мне: -
package org.rsf.pages;
import java.util.concurrent.TimeUnit;
import org.apache.log4j.Logger;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.ui.Select;
import org.rsf.bean.EnterQuoteBean;
import org.rsf.utilities.Utility;
import org.rsf.wrapper.driver.RsfWebDriver;
import org.rsf.wrapper.element.RsfElement;
import org.testng.Assert;
//pageObject
public class EnterQuotePage extends PageBase {
public EnterQuotePage(RsfWebDriver driver) {
super(driver);
super.driver=driver;
}
//creating my custom wrapper object
private RsfElement element;
private static Logger log=Logger.getLogger(EnterQuotePage.class);
Utility utilities = new Utility();
EnterQuoteBean eqb= new EnterQuoteBean();
public void open(String url) {
System.out.println("Inside get url");
System.out.println("url is : " +url);
System.out.println(" PB : Driver value :-" + driver);
Assert.assertNotNull(this.driver);
this.driver.get(url);
System.out.println("After get url");
}
public void clickHit()
{
super.driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
//ERROR OCCURS IN BELOW TWO LINES [in element]
element=super.driver.findElement(By.id("hit"));
element.click();
}
public String getQuoteID(){
String quoteText =findMessage.getText();
String quoteText1[] = quoteText.split("\\=");
quoteText1[1]=quoteText1[1].trim();
System.out.println("Generated Quote Id :- " + quoteText1[1]);
return quoteText1[1];
}
public void checkSuccessMessage(){
String successMessage = findMessage.getText();
Assert.assertEquals(element.getText().contains(successMessage), eqb.getSuccessMessage());
}
}
. Решение
Чтобы решить эту проблему, как показано ниже
Создайте файл XML с элементами и добавьте класс анализа XML, вы можете легко найти код в Интернете для анализатора XML. например.
<Element name="ElementSource">
<Sample>
<ElementTagName by="Xpth,id etc..">LocaterValue</ElementTagName>
<txtUserName by="id">username</txtUserName>
</Sample>
.
Создать класс, которые имеют статические элементы веб-страницы такими же, как и в файле XML E.G.
public static final String txtUserName = "txtUserName";
.
Вы можете иметь страницу мудрых классов или один класс. Кроме того, вы можете напрямую упомянуть свои элементы в этом классе без файла XML.
Создание класса, содержащего модули для чтения этого класса XML-файла или класса элемента, чтобы получить элемент-локатип и его местоположение, подобное XPath, ID и т. Д. Вы можете хранить их в переменные.
Наконец, создайте класс с именем elemilectlocater, имеющим функцию, чтобы найти элементы в соответствии с его местоположением, используя регистр коммутатора. например
public WebElement locateElement(WebDriver driver, String Locater,
String LocateBy) {
try {
switch (LocateBy.toLowerCase()) {
case "xpath":
return driver.findElement(By.xpath(Locater));
case "id":
return driver.findElement(By.id(Locater));
....
//So on
default:
return null;
}
}
catch (Exception e)
{
//Write to log or custom error message
}
return null;
}
.
Вы можете создавать больше функций в этом классе, такими как IselementPreset и т. Д. ...
, делая это, вам не нужно входить в исходный код или в тестах каждый раз, когда необходимо выполнить любой элемент HTML-развертывания или обновление кода. Изменить любую одну функцию или переменную будет делать :)
Другие советы
Вам нужно поймать NoSuchelementException:
try
{
element=super.driver.findElement(By.id("hit"));
element.click();
}
catch (NoSuchElementException e)
{
// Do whatever you were planning to do if the element was not found
// (you can try again for example)
}
.
В качестве альтернативы вы можете сделать следующее («Сохранить» вы обработали исключение):
List<WebElement> elements = super.driver.findElements(By.id("hit"));
if (elements.size() > 0)
elements.get(0).click();
.