我们网站上的便当盒组中有3个链接。如果链接文本符合我的条件,我需要单击特定链接(我需要单击所有3个链接,我需要在单击后执行不同的操作)。为了达到这个目的,我在for循环中编写了if循环。
当我执行此操作时,对于第一个循环,即i = 0,它会点击正确的链接。对于第二个循环(i = 1),我希望它选择第二个循环。但它点击了第三个链接。对于第三个循环,它会点击第三个链接。不知道我在这里缺少什么。
public void SeasonalLinks() throws InterruptedException
{
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
List <WebElement> Seasonallnks = driver.findElements(By.xpath("//section[@id='seasonallinks']/ul/li/div/a"));
int sl = Seasonallnks.size();
System.out.println("Total no.of seasonal Links: "+sl);
int i=0;
for (i=0;i<sl;i++)
{
List <WebElement> Seasonallnks1 = driver.findElements(By.xpath("//section[@id='seasonal-links']/ul/li/div/a"));
String sl1 = Seasonallnks1.get(i).getText();
if (sl1.equalsIgnoreCase("Start a provider search"))
{
Seasonallnks1.get(i).click();
WebDriverWait pshome = new WebDriverWait(driver,20);
pshome.until(ExpectedConditions.elementToBeClickable(By.xpath("//li[@id='nav-home']/a[@aria-label='home button']")));
Thread.sleep(5000);
driver.findElement(By.xpath("//li[@id='nav-home']/a[@aria-label='home button']")).click();
}
else if (sl1.equalsIgnoreCase("Use pharmacy self-service tools"))
{
Seasonallnks1.get(i).click();
WebDriverWait phome = new WebDriverWait(driver,20);
phome.until(ExpectedConditions.elementToBeClickable(By.xpath("//li[@id='nav-home']/a[@aria-label='home button']")));
Thread.sleep(5000);
WebDriverWait iswait1 = new WebDriverWait(driver,30);
iswait1.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//div[@class='acc-spinner-container]")));
driver.findElement(By.xpath("//li[@id='nav-home']/a[@aria-label='home button']")).click();
}
else if (sl1.equalsIgnoreCase("Start rewarding yourself today"))
{
Seasonallnks1.get(i).click();
WebDriverWait hhome = new WebDriverWait(driver,20);
hhome.until(ExpectedConditions.elementToBeClickable(By.xpath("//li[@id='nav-home']/a[@aria-label='home button']")));
driver.findElement(By.xpath("//li[@id='nav-home']/a[@aria-label='home button']")).click();
}
}
答案 0 :(得分:0)
一些反馈......为了使您的代码更易于维护并节省工作量,您应该遵循DRY principle(消除重复代码)。如果你看看你的if-else
链,那里有很多重复。每次单击同一链接时,请等待元素可单击并单击它。对于单一元素,你真的只有一件独特的事情。
应避免使用Thread.sleep()
(谷歌查看完整说明)。您已经在使用WebDriverWait
,这是一种很好的做法,因此请添加另一个WebDriverWait
以避免Thread.sleep()
使用,如果需要的话。
您有两个集合Seasonallnks
和Seasonallnks1
,它们都存储相同的元素,但第二个实例看起来在定位器中有拼写错误。我把他们两个结合起来。
implicitlyWait()
超时只需要在驱动程序的生命周期内设置一次,并且可能应该在此函数之外设置。
int i = 0;
的声明可以/应该在for
循环声明中完成。
您声明了两次等待,但您可以重复使用第一次等待使代码更简洁。
如果您多次使用定位器,请考虑将其声明为By
类型的变量,以便于重复使用。它避免了拼写错误,并且在需要时更容易更改,因为它只需要在一个地方进行更改。
wait.until()
返回等待的元素,所以当你等待一个元素可点击然后打算点击它时,你可以只添加.click()
到最后,例如wait.until(...).click();
您还应该努力获得更多描述性变量名称。它可以帮助您在几个月内或其他需要阅读您的代码并弄清楚它正在做什么的人。
希望您可以从下面的清理代码中看到使用DRY并应用我上面列出的其他一些建议可以节省多少行。
public void SeasonalLinks() throws InterruptedException
{
By seasonalLinksLocator = By.xpath("//section[@id='seasonallinks']/ul/li/div/a");
List<WebElement> seasonalLinks = driver.findElements(seasonalLinksLocator);
System.out.println("Total no.of seasonal Links: " + seasonalLinks.size());
WebDriverWait wait = new WebDriverWait(driver, 20);
for (int i = 0; i < seasonalLinks.size(); i++)
{
String seasonalLinkText = seasonalLinks.get(i).getText();
seasonalLinks.get(i).click();
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//li[@id='nav-home']/a[@aria-label='home button']"))).click();
if (seasonalLinkText.equalsIgnoreCase("Use pharmacy self-service tools"))
{
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//div[@class='acc-spinner-container]")));
}
seasonalLinks = driver.findElements(seasonalLinksLocator);
}
}