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

Java 无法单击元素并重定向到selenium中的新选项卡,java,selenium,xpath,selenium-webdriver,Java,Selenium,Xpath,Selenium Webdriver,我试图通过在不同的网站上测试来学习selenium。在这个过程中,我尝试与Flipkart网站合作。在这方面,我想给彪马是搜索栏,并试图点击其中一个结果项目。但我无法使用下面提到的代码来实现这一点。有人能帮忙解决吗 第二,如果我们点击任何项目,它将被重定向到新标签。如何使用相同的脚本访问新的选项卡元素 import org.openqa.selenium.By; import org.openqa.selenium.Keys; import org.openqa.selenium.NoSuchE

我试图通过在不同的网站上测试来学习selenium。在这个过程中,我尝试与Flipkart网站合作。在这方面,我想给彪马是搜索栏,并试图点击其中一个结果项目。但我无法使用下面提到的代码来实现这一点。有人能帮忙解决吗

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

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();
    }

}

您需要使用窗口切换功能

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);
String mainWindowHandle=driver.getWindowHandle();
ArrayList wins=driver.getWindowHandles();
//您可以在这里使用for循环,或者直接获取假定的第二个窗口
driver.switchTo().window(wins.get(1));
//测试一些东西,然后切换回来
driver.close();
driver.switchTo().window(mainWindowHandle);

请参见

您需要使用窗口切换功能

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);
String mainWindowHandle=driver.getWindowHandle();
ArrayList wins=driver.getWindowHandles();
//您可以在这里使用for循环,或者直接获取假定的第二个窗口
driver.switchTo().window(wins.get(1));
//测试一些东西,然后切换回来
driver.close();
driver.switchTo().window(mainWindowHandle);

请参见使用此代码到达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(); 
    }

}

使用此代码到达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(); 
    }

}

你必须检查整个框架。我建议不要自己定制xpath,而是尝试
firebug
firepath
插件
Firefox
来获取整个元素的xpath。检查显示结果的整个帧,然后将其保存在以下变量中:

List<WebElements> searchResults;  
searchResults=driver.findElements(By.xpath("Your xpath"));  
列出搜索结果;
searchResults=driver.findElements(By.xpath(“您的xpath”);

然后使用索引访问此列表的元素,然后您可以执行
。单击()
操作。更多关于使用
firebug
firepath

捕获xpath的链接,您必须检查整个帧。我建议不要自己定制xpath,而是尝试
firebug
firepath
插件
Firefox
来获取整个元素的xpath。检查显示结果的整个帧,然后将其保存在以下变量中:

List<WebElements> searchResults;  
searchResults=driver.findElements(By.xpath("Your xpath"));  
列出搜索结果;
searchResults=driver.findElements(By.xpath(“您的xpath”);

然后使用索引访问此列表的元素,然后您可以执行
。单击()
操作。有关使用
firebug
firepath
捕获xpath的更多链接问题1:在执行上述代码的最后一行时,我遇到以下错误。找不到元素://a[@title='Puma Men Black Wallet'和@class='\u 1nybr\u 30XEf0']

-->由于延迟加载,当您点击它时,dom中不存在webelement。因此,要解决这个问题,您需要在视图中创建webElement,然后点击点击事件。

请参阅以下代码:-

    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:如果最后一个命令有效,那么它将被重定向到新选项卡。那么如何从新选项卡访问元素呢

-->正如@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());
String mainWindowHandle=driver.getWindowHandle();
ArrayList wins=driver.getWindowHandles();
for(字符串赢:赢){
driver.switchTo()窗口(win);
//其他操作
System.out.println(driver.getTitle());
}
//回到旧窗口
driver.switchTo().window(mainWindowHandle);
System.out.println(driver.getTitle());

希望这对您有所帮助:)

问题1:在执行上述代码的最后一行时,我遇到了以下错误。找不到元素://a[@title='Puma Men Black Wallet'和@class='\u 1nybr\u 30XEf0']

-->由于延迟加载,当您点击它时,dom中不存在webelement。因此,要解决这个问题,您需要在视图中创建webElement,然后点击点击事件。

请参阅以下代码:-

    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:如果最后一个命令有效,那么它将被重定向到新选项卡。那么如何从新选项卡访问元素呢

-->正如@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());
String mainWindowHandle=driver.getWindowHandle();
ArrayList wins=driver.getWindowHandles();
for(字符串赢:赢){
driver.switchTo()窗口(win);
//其他操作
System.out.println(driver.getTitle());
}
//回到旧窗口
driver.switchTo().window(mainWindowHandle);
System.out.println(driver.getTitle());

希望这对您有所帮助:)

哪些线路给您带来了麻烦?据我所知,我相信你可以像进入不同窗口一样进入不同的选项卡:
SwitchToWindow(“nameOfTab”)不清楚你问什么。或者因为我对Java不太熟悉问题1:在执行上述代码的最后一行时,我得到了以下错误。找不到元素://a[@title='Puma Men Black Wallet'和@class='\u 1nybr\u 30XEf0']问题2:如果最后一个命令有效,则会重定向到新选项卡。那么,如何从新选项卡访问元素呢?请编辑问题,将其限制为特定问题,并提供足够详细的信息,以确定适当的答案。避免同时问多个不同的问题。请参阅本页以获取澄清此问题的帮助。哪些行给您带来了麻烦?据我所知,我相信你可以像进入不同窗口一样进入不同的选项卡:
SwitchToWindow(“nameOfTab”)不清楚你问了什么。或者因为我对Java不太熟悉问题1:在执行上述代码的最后一行时,我得到了以下结果