Java 无法单击元素并重定向到selenium中的新选项卡
我试图通过在不同的网站上测试来学习selenium。在这个过程中,我尝试与Flipkart网站合作。在这方面,我想给彪马是搜索栏,并试图点击其中一个结果项目。但我无法使用下面提到的代码来实现这一点。有人能帮忙解决吗 第二,如果我们点击任何项目,它将被重定向到新标签。如何使用相同的脚本访问新的选项卡元素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
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:在执行上述代码的最后一行时,我得到了以下结果