无法单击元素并重定向到selenium中的新选项卡

问题描述 投票:0回答:4

我试图通过在不同的网站上测试来学习硒。在这个过程中,我正在尝试使用Flipkart网站。在这,我想给puma是搜索栏,并试图点击其中一个结果项。但我无法使用下面提到的代码来做到这一点。任何人都可以帮忙解决它吗?

其次,如果我们点击任何项目,它将被重定向到新标签。如何使用相同的脚本访问新标签元素?

import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;


public class AutomationTesting {
    public static void main(String[] args) {

        System.setProperty("webdriver.gecko.driver","/Users/xxxx/eclipse-workspace/seleniumTesting/lib/geckoDriver/geckodriver");
        WebDriver driver = new FirefoxDriver();
        driver.get("https://www.google.de");
        driver.findElement(By.id("lst-ib")).sendKeys("flipkart");
        driver.findElement(By.id("lst-ib")).sendKeys(Keys.ENTER);
        WebDriverWait wait = new WebDriverWait(driver, 20); 
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.partialLinkText("Flipkart")));
        driver.findElement(By.partialLinkText("Flipkart")).click();
        driver.findElement(By.cssSelector("._3Njdz7 [class = '_2AkmmA _29YdH8']")).click();
        driver.findElement(By.xpath("//input[@class = 'LM6RPg']")).click();
        driver.findElement(By.xpath("//input[@class = 'LM6RPg']")).sendKeys("Puma");
        driver.findElement(By.xpath("//button[@class = 'vh79eN']")).click();
        driver.findElement(By.xpath("//a[@title='Puma Men Black Wallet' and @class= '_1Nyybr _30XEf0']")).click();
    }

}
java selenium xpath selenium-webdriver
4个回答
2
投票

您需要使用window switchTo功能。

String mainWindowHandle = driver.getWindowHandle();
ArrayList<String> wins = driver.getWindowHandles();
// You can use a for loop here, or get the assumed second window directly
driver.switchTo().window(wins.get(1));
// Test some things, then switch back
driver.close();
driver.switchTo().window(mainWindowHandle);

http://www.seleniumhq.org/docs/03_webdriver.jsp#moving-between-windows-and-frames


0
投票

你必须检查整个框架。我建议不要自己定制xpaths尝试firebugfirepath添加Firefox获取整个元素的xpath。检查结果显示的整个帧,然后将其保存在一个变量中,如下所示:

List<WebElements> searchResults;  
searchResults=driver.findElements(By.xpath("Your xpath"));  

然后使用索引访问此列表的元素,然后您可以执行相同的.click()操作。更多关于使用thisfirebug捕获xpath的firepath链接


0
投票

问题1:在执行上面代码中的最后一行期间,我收到以下错误。无法找到element:// a [@ title ='Puma Men Black Wallet'和@ class ='_1Nyybr _30XEf0']

- >由于延迟加载webelement在你点击它上面的点击事件时不存在于dom中。所以要完成这个,你需要在视图上创建webElement然后点击click事件。

请参考以下代码: -

    driver.get("https://www.google.de");
       driver.findElement(By.id("lst-ib")).sendKeys("flipkart");
       driver.findElement(By.id("lst-ib")).sendKeys(Keys.ENTER);
       WebDriverWait wait = new WebDriverWait(driver,60); 
       wait.until(ExpectedConditions.visibilityOfElementLocated(By.partialLinkText("Flipkart")));
       driver.findElement(By.partialLinkText("Flipkart")).click();

       try{
       driver.findElement(By.cssSelector("._3Njdz7 [class = '_2AkmmA _29YdH8']")).click();
       }catch(Exception e){

           System.out.println("No division");
       }

       driver.findElement(By.xpath("//input[@class = 'LM6RPg']")).click();
       driver.findElement(By.xpath("//input[@class = 'LM6RPg']")).sendKeys("Puma");
       driver.findElement(By.xpath("//button[@class = 'vh79eN']")).click();

      // Thread.sleep(3000);

       wait.until(ExpectedConditions.visibilityOf( driver.findElement(By.xpath("//a[@title='Puma Men Black Wallet']"))));

// getting element into view 
       ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView();", driver.findElement(By.xpath("//*[@alt='Puma Men Black Wallet']"))); 

       Thread.sleep(2000);
       driver.findElement(By.xpath("//*[@alt='Puma Men Black Wallet']")).click();

问题2:如果最后一个命令有效,那么它将被重定向到新选项卡。那么如何从new-tab访问元素呢?

- >正如建议@Damian Jansen在最后点击事件后添加该代码。

  String mainWindowHandle = driver.getWindowHandle();
    ArrayList<String> wins = driver.getWindowHandles();

   for(String win : wins ){

       driver.switchTo().window(win);

      // other operation 

       System.out.println(driver.getTitle());   

 }
// back to old window
   driver.switchTo().window(mainWindowHandle);

   System.out.println(driver.getTitle());

希望这对你有所帮助:)


0
投票

使用此代码达到puma,然后在代码下面选择使用选项

   public static void main(String[] args) throws InterruptedException, AWTException {

        System.setProperty("webdriver.chrome.driver","G:\\java programme\\SendkeysExample\\lib\\chromedriver.exe");
        WebDriver driver = new ChromeDriver();

        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

        driver.get("https://www.google.com");
        driver.findElement(By.id("lst-ib")).sendKeys("flipkart");
        driver.findElement(By.id("lst-ib")).sendKeys(Keys.ENTER);

        driver.findElement(By.linkText("Flipkart")).click();
        driver.findElement(By.className("LM6RPg")).sendKeys("Puma");

        Robot rb = new Robot();
        rb.keyPress(KeyEvent.VK_DOWN);
        rb.keyPress(KeyEvent.VK_DOWN);
        rb.keyPress(KeyEvent.VK_ENTER);

        rb.keyRelease(KeyEvent.VK_DOWN);
        rb.keyRelease(KeyEvent.VK_DOWN);
        rb.keyRelease(KeyEvent.VK_ENTER);

        Thread.sleep(2000);

        /*driver.findElement(By.xpath(".//*[@id='container']/div/header/div[1]/div/div/div/div[1]/form/ul/li[2]/a"));
        driver.findElement(By.className("icon-add-circle"))*/;
        driver.close(); 
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.