对元素使用 Switch 而不是 if/elseif
Use Switch for element instead of if/elseif
public void profileSection(String displayName, String fName, String lName, String Address_1,) throws Exception
{
myAccountPageNative(CONSTANTs.MY_ACCOUNT_LINK);
clickLink(CONSTANTs.MY_PROFILE_SECTION);
if(driver.findElement(By.cssSelector(CONSTANTs.DISPLAY_NAME_TXTBOX)).isDisplayed())
{
log.step("Optional..... BUT you will need it when Commenting on any article....");
elementPresent_Click(By.cssSelector(CONSTANTs.DISPLAY_NAME_TXTBOX), displayName);
Thread.sleep(2000);
}else if(driver.findElement(By.cssSelector(CONSTANTs.MYACCT_EMAIL_TXTBOX)).isDisplayed())
{
log.step("Check if Email txtbox is enabled or not...... pls wait.");
txtBoxDisabled(By.cssSelector(CONSTANTs.MYACCT_EMAIL_TXTBOX),null);
Thread.sleep(2000);
log.step("Text box is disabled..... move to next step");
Thread.sleep(2000);
}else if(driver.findElement(By.cssSelector(CONSTANTs.FIRST_NAME)).isDisplayed())
{
log.step("Input First Name......");
txtBoxDisabled(By.cssSelector(CONSTANTs.FIRST_NAME),fName);
Thread.sleep(2000);
}else if(driver.findElement(By.cssSelector(CONSTANTs.LAST_NAME)).isDisplayed())
{
log.step("Input Last Name......");
txtBoxDisabled(By.cssSelector(CONSTANTs.LAST_NAME),lName);
Thread.sleep(2000);
}else if(driver.findElement(By.cssSelector(CONSTANTs.ADDRESS_1)).isDisplayed())
{
log.step("Input Address 1......");
txtBoxDisabled(By.cssSelector(CONSTANTs.ADDRESS_1),Address_1);
Thread.sleep(2000);
}
log.step("Click Save Changes Button......");
txtBoxDisabled(By.cssSelector(CONSTANTs.SAVE_CHANGES_BTN),null);
}
Please am trying to use a switch instead of too many if statements. just to make my code more readable. Since switch evaluates a single variable, Can i use switch with my code cos it looks a bit more complex i guess.
An suggestion please, as all have different element to be selected using css Selector.
提前致谢。
你这里有一个误解(对于一个新程序员来说是完全可以理解的)。
您似乎认为使用 if/else 的转换会使您的代码更具可读性,事实很可能不会。那么如何让你的代码更具可读性呢?很简单,去掉你所有的重复。
例如,您在每个 if/else 中调用一个 Thread.sleep
。而是将其拉出并放在 if/else 语句之后。
您可以做的另一件事是,您可以将查找的元素移动到 class 顶部的它们自己的变量中。然后简单地调用 isDisplayed
对它们
示例:
displayNameTextbox = driver.findElement(By.cssSelector(CONSTANTs.DISPLAY_NAME_TXTBOX));
if(displayNameTextbox.isDisplayed())
{
log.step("Optional..... BUT you will need it when Commenting on any article....");
elementPresent_Click(By.cssSelector(CONSTANTs.DISPLAY_NAME_TXTBOX), displayName);
}
因为这似乎是在 Selenium 中,我实际上建议创建一个页面对象并使用它来简化您的代码。
另一件需要注意的事情是,您可以将这些 if 中的每一个分离到它们自己的方法中,并在必要时简单地检查它们,而不是一次检查它们。但这更多取决于您打算如何使用它。
我认为这可能是一个更合适和优雅的解决方案。构建一个包含要检查的元素的数组并循环遍历这些元素。
public void profileSection(String displayName, String fName, String lName, String Address_1,
String Address_2, String city, String country,
String postcode, String telephone) throws Exception
{
myAccountPageNative(CONSTANTs.MY_ACCOUNT_LINK);
clickLink(CONSTANTs.MY_PROFILE_SECTION);
String [] elementNames = new String [] {
CONSTANTs.DISPLAY_NAME_TXTBOX,
CONSTANTs.MYACCT_EMAIL_TXTBOX,
CONSTANTs.FIRST_NAME,
CONSTANTs.LAST_NAME,
CONSTANTs.ADDRESS_1
};
for (String elementName : elementNames) {
if(driver.findElement(By.cssSelector(elementName)).isDisplayed()) {
elementPresent_Click(By.cssSelector(elementName), displayName);
Thread.sleep(2000);
break; // when found break out of loop
}
}
log.step("Click Save Changes Button......");
txtBoxDisabled(By.cssSelector(CONSTANTs.SAVE_CHANGES_BTN),null);
}
你已经有了答案,但我还是试一试。我将使用 enum
删除 if/else
并且代码将更加面向对象。顺便说一句 - 除了 if/else 之外,还有许多其他领域的代码可以改进,例如命名约定。
MyTest class
public class MyTest {
public void profileSection(String displayName, String fName, String lName,
String Address_1, String Address_2, String city, String country,
String postcode, String telephone) throws Exception {
myAccountPageNative(CONSTANTs.MY_ACCOUNT_LINK);
clickLink(CONSTANTs.MY_PROFILE_SECTION);
Driver driver = null;
MyEnum.test(driver, displayName, fName, lName, Address_1, Address_2, city, country, postcode, telephone);
MyEnum.SAVE_CHANGES_BTN.doOperation(displayName, fName, lName, Address_1, Address_2, city, country, postcode, telephone);
}
private void clickLink(String myProfileSection) {
// TODO Auto-generated method stub
}
private void myAccountPageNative(String myAccountLink) {
// TODO Auto-generated method stub
}
}
MyEnum class
public enum MyEnum {
DISPLAY_NAME_TXTBOX {
@Override
public void doOperation(String displayName, String fName, String lName,
String Address_1, String Address_2, String city, String country,
String postcode, String telephone) {
elementPresent_Click(By.cssSelector(name()),
displayName);
}
private void elementPresent_Click(Selector cssSelector,
String displayName) {
}
},
MYACCT_EMAIL_TXTBOX {
@Override
public void doOperation(String displayName, String fName, String lName,
String Address_1, String Address_2, String city, String country,
String postcode, String telephone) {
txtBoxDisabled(By.cssSelector(name()), null);
}
private void txtBoxDisabled(Selector cssSelector, Object object) {
}
},
FIRST_NAME {
@Override
public void doOperation(String displayName, String fName, String lName,
String Address_1, String Address_2, String city, String country,
String postcode, String telephone) {
txtBoxDisabled(By.cssSelector(name()), fName);
}
private void txtBoxDisabled(Selector cssSelector, Object object) {
}
},
LAST_NAME {
@Override
public void doOperation(String displayName, String fName, String lName,
String Address_1, String Address_2, String city, String country,
String postcode, String telephone) {
txtBoxDisabled(By.cssSelector(name()), lName);
}
private void txtBoxDisabled(Selector cssSelector, Object object) {
}
},
ADDRESS_1 {
@Override
public void doOperation(String displayName, String fName, String lName,
String Address_1, String Address_2, String city, String country,
String postcode, String telephone) {
txtBoxDisabled(By.cssSelector(name()), Address_1);
}
private void txtBoxDisabled(Selector cssSelector, Object object) {
}
},
SAVE_CHANGES_BTN {
@Override
public void doOperation(String displayName, String fName, String lName,
String Address_1, String Address_2, String city, String country,
String postcode, String telephone) {
}
};
public static void test(Driver driver, String displayName, String fName, String lName,
String Address_1, String Address_2, String city, String country,
String postcode, String telephone) {
for(MyEnum enum1 : MyEnum.values()) {
if(driver.findElement(By.cssSelector(enum1.name())).isDisplayed()) {
enum1.doOperation(displayName, fName, lName, Address_1, Address_2, city, country, postcode, telephone);
}
}
}
abstract public void doOperation( String displayName, String fName, String lName,
String Address_1, String Address_2, String city, String country,
String postcode, String telephone);
}
public void profileSection(String displayName, String fName, String lName, String Address_1,) throws Exception
{
myAccountPageNative(CONSTANTs.MY_ACCOUNT_LINK);
clickLink(CONSTANTs.MY_PROFILE_SECTION);
if(driver.findElement(By.cssSelector(CONSTANTs.DISPLAY_NAME_TXTBOX)).isDisplayed())
{
log.step("Optional..... BUT you will need it when Commenting on any article....");
elementPresent_Click(By.cssSelector(CONSTANTs.DISPLAY_NAME_TXTBOX), displayName);
Thread.sleep(2000);
}else if(driver.findElement(By.cssSelector(CONSTANTs.MYACCT_EMAIL_TXTBOX)).isDisplayed())
{
log.step("Check if Email txtbox is enabled or not...... pls wait.");
txtBoxDisabled(By.cssSelector(CONSTANTs.MYACCT_EMAIL_TXTBOX),null);
Thread.sleep(2000);
log.step("Text box is disabled..... move to next step");
Thread.sleep(2000);
}else if(driver.findElement(By.cssSelector(CONSTANTs.FIRST_NAME)).isDisplayed())
{
log.step("Input First Name......");
txtBoxDisabled(By.cssSelector(CONSTANTs.FIRST_NAME),fName);
Thread.sleep(2000);
}else if(driver.findElement(By.cssSelector(CONSTANTs.LAST_NAME)).isDisplayed())
{
log.step("Input Last Name......");
txtBoxDisabled(By.cssSelector(CONSTANTs.LAST_NAME),lName);
Thread.sleep(2000);
}else if(driver.findElement(By.cssSelector(CONSTANTs.ADDRESS_1)).isDisplayed())
{
log.step("Input Address 1......");
txtBoxDisabled(By.cssSelector(CONSTANTs.ADDRESS_1),Address_1);
Thread.sleep(2000);
}
log.step("Click Save Changes Button......");
txtBoxDisabled(By.cssSelector(CONSTANTs.SAVE_CHANGES_BTN),null);
}
Please am trying to use a switch instead of too many if statements. just to make my code more readable. Since switch evaluates a single variable, Can i use switch with my code cos it looks a bit more complex i guess. An suggestion please, as all have different element to be selected using css Selector.
提前致谢。
你这里有一个误解(对于一个新程序员来说是完全可以理解的)。
您似乎认为使用 if/else 的转换会使您的代码更具可读性,事实很可能不会。那么如何让你的代码更具可读性呢?很简单,去掉你所有的重复。
例如,您在每个 if/else 中调用一个 Thread.sleep
。而是将其拉出并放在 if/else 语句之后。
您可以做的另一件事是,您可以将查找的元素移动到 class 顶部的它们自己的变量中。然后简单地调用 isDisplayed
对它们
示例:
displayNameTextbox = driver.findElement(By.cssSelector(CONSTANTs.DISPLAY_NAME_TXTBOX));
if(displayNameTextbox.isDisplayed())
{
log.step("Optional..... BUT you will need it when Commenting on any article....");
elementPresent_Click(By.cssSelector(CONSTANTs.DISPLAY_NAME_TXTBOX), displayName);
}
因为这似乎是在 Selenium 中,我实际上建议创建一个页面对象并使用它来简化您的代码。
另一件需要注意的事情是,您可以将这些 if 中的每一个分离到它们自己的方法中,并在必要时简单地检查它们,而不是一次检查它们。但这更多取决于您打算如何使用它。
我认为这可能是一个更合适和优雅的解决方案。构建一个包含要检查的元素的数组并循环遍历这些元素。
public void profileSection(String displayName, String fName, String lName, String Address_1,
String Address_2, String city, String country,
String postcode, String telephone) throws Exception
{
myAccountPageNative(CONSTANTs.MY_ACCOUNT_LINK);
clickLink(CONSTANTs.MY_PROFILE_SECTION);
String [] elementNames = new String [] {
CONSTANTs.DISPLAY_NAME_TXTBOX,
CONSTANTs.MYACCT_EMAIL_TXTBOX,
CONSTANTs.FIRST_NAME,
CONSTANTs.LAST_NAME,
CONSTANTs.ADDRESS_1
};
for (String elementName : elementNames) {
if(driver.findElement(By.cssSelector(elementName)).isDisplayed()) {
elementPresent_Click(By.cssSelector(elementName), displayName);
Thread.sleep(2000);
break; // when found break out of loop
}
}
log.step("Click Save Changes Button......");
txtBoxDisabled(By.cssSelector(CONSTANTs.SAVE_CHANGES_BTN),null);
}
你已经有了答案,但我还是试一试。我将使用 enum
删除 if/else
并且代码将更加面向对象。顺便说一句 - 除了 if/else 之外,还有许多其他领域的代码可以改进,例如命名约定。
MyTest class
public class MyTest {
public void profileSection(String displayName, String fName, String lName,
String Address_1, String Address_2, String city, String country,
String postcode, String telephone) throws Exception {
myAccountPageNative(CONSTANTs.MY_ACCOUNT_LINK);
clickLink(CONSTANTs.MY_PROFILE_SECTION);
Driver driver = null;
MyEnum.test(driver, displayName, fName, lName, Address_1, Address_2, city, country, postcode, telephone);
MyEnum.SAVE_CHANGES_BTN.doOperation(displayName, fName, lName, Address_1, Address_2, city, country, postcode, telephone);
}
private void clickLink(String myProfileSection) {
// TODO Auto-generated method stub
}
private void myAccountPageNative(String myAccountLink) {
// TODO Auto-generated method stub
}
}
MyEnum class
public enum MyEnum {
DISPLAY_NAME_TXTBOX {
@Override
public void doOperation(String displayName, String fName, String lName,
String Address_1, String Address_2, String city, String country,
String postcode, String telephone) {
elementPresent_Click(By.cssSelector(name()),
displayName);
}
private void elementPresent_Click(Selector cssSelector,
String displayName) {
}
},
MYACCT_EMAIL_TXTBOX {
@Override
public void doOperation(String displayName, String fName, String lName,
String Address_1, String Address_2, String city, String country,
String postcode, String telephone) {
txtBoxDisabled(By.cssSelector(name()), null);
}
private void txtBoxDisabled(Selector cssSelector, Object object) {
}
},
FIRST_NAME {
@Override
public void doOperation(String displayName, String fName, String lName,
String Address_1, String Address_2, String city, String country,
String postcode, String telephone) {
txtBoxDisabled(By.cssSelector(name()), fName);
}
private void txtBoxDisabled(Selector cssSelector, Object object) {
}
},
LAST_NAME {
@Override
public void doOperation(String displayName, String fName, String lName,
String Address_1, String Address_2, String city, String country,
String postcode, String telephone) {
txtBoxDisabled(By.cssSelector(name()), lName);
}
private void txtBoxDisabled(Selector cssSelector, Object object) {
}
},
ADDRESS_1 {
@Override
public void doOperation(String displayName, String fName, String lName,
String Address_1, String Address_2, String city, String country,
String postcode, String telephone) {
txtBoxDisabled(By.cssSelector(name()), Address_1);
}
private void txtBoxDisabled(Selector cssSelector, Object object) {
}
},
SAVE_CHANGES_BTN {
@Override
public void doOperation(String displayName, String fName, String lName,
String Address_1, String Address_2, String city, String country,
String postcode, String telephone) {
}
};
public static void test(Driver driver, String displayName, String fName, String lName,
String Address_1, String Address_2, String city, String country,
String postcode, String telephone) {
for(MyEnum enum1 : MyEnum.values()) {
if(driver.findElement(By.cssSelector(enum1.name())).isDisplayed()) {
enum1.doOperation(displayName, fName, lName, Address_1, Address_2, city, country, postcode, telephone);
}
}
}
abstract public void doOperation( String displayName, String fName, String lName,
String Address_1, String Address_2, String city, String country,
String postcode, String telephone);
}