在同一窗口中从一页导航到另一页时出现selenium对象标识问题

在同一窗口中从一页导航到另一页时出现selenium对象标识问题,selenium,selenium-webdriver,Selenium,Selenium Webdriver,在同一窗口中从一个网页导航到另一个网页时,selenium显示在第二个网页上找不到这样的元素。例如,成功登录后,直到登录页面,它才能找到对象,但它无法识别对象。请告诉我为什么会发生这种情况,以及解决办法是什么。对于第二种方法,我面临这个问题。我用了线。睡眠和切换窗口仍然面临问题 public void LoginKaplan() { driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);

在同一窗口中从一个网页导航到另一个网页时,selenium显示在第二个网页上找不到这样的元素。例如,成功登录后,直到登录页面,它才能找到对象,但它无法识别对象。请告诉我为什么会发生这种情况,以及解决办法是什么。对于第二种方法,我面临这个问题。我用了线。睡眠和切换窗口仍然面临问题

public void LoginKaplan() {

        driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
        kecUserNameTextBox.sendKeys("abc");
        kecPasswordTextBox.sendKeys("123#");
        userNameTextBox.sendKeys("a1");
        passwordTextBox.sendKeys("1234");

    driver.findElement(By.xpath("//div[@id='productName_chosen']/a/span"))
                .click();
        driver.findElement(
                By.xpath("//div[@id='productName_chosen']/div/div/input"))
                .sendKeys("DAT2015");

        WebDriverWait wait = new WebDriverWait(driver, 120);

        List<WebElement> findElements = driver.findElements(By
                .xpath("//*[@id='productName_chosen']/div/ul/li[2]/em"));
        WebElement element = wait
                .until(ExpectedConditions.elementToBeClickable(By
                        .xpath("//*[@id='productName_chosen']/div/ul/li[2]/em")));

        for (WebElement webElement : findElements) {
            if (webElement.getText().equals("DAT2015")) {
                driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
                webElement.click();
                break;
            }
        }
        try {
            Thread.sleep(8000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        driver.findElement(By.xpath("//div[@id='syllabusPath_chosen']/a/span"))
                .click();
        driver.findElement(
                By.xpath("//div[@id='syllabusPath_chosen']/div/div/input"))
                .click();

        driver.findElement(
                By.xpath("//div[@id='syllabusPath_chosen']/div/div/input"))
                .sendKeys("/DAT2015/assessments/secTests/qdatoatnatsciA15");
        driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);

        List<WebElement> findElements2 = driver.findElements(By
                .xpath("//div[@id='syllabusPath_chosen']/div/ul/li/em"));
        WebElement element2 = wait
                .until(ExpectedConditions.elementToBeClickable(By
                        .xpath("//div[@id='syllabusPath_chosen']/div/ul/li/em")));
        driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
        for (WebElement webElement : findElements2) {
            if (webElement.getText().equals(
                    "/DAT2015/assessments/secTests/qdatoatnatsciA15")) {
                driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
                webElement.click();
                break;
            }
        }

        loginButton.click();
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        driver.switchTo().defaultContent();
}

//Method 2----------------------------------------------------
    public void QuestionsAns() {
        try {
            Thread.sleep(22000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        driver.findElement(
                By.id("subitem0.singleAnswerMultipleChoice.answerChoiceRow1.state0"))
                .click();
        driver.findElement(By.id("img2.simNext")).click();
        driver.findElement(
                By.id("subitem0.singleAnswerMultipleChoice.answerChoiceRow2.state0"))
                .click();
        driver.findElement(By.id("img2.simNext")).click();
        driver.findElement(
                By.id("subitem0.singleAnswerMultipleChoice.answerChoiceRow2.state0"))
                .click();
        driver.findElement(By.id("img2.simNext")).click();

    }
public void LoginKaplan(){
driver.manage().timeouts().implicitlyWait(60,TimeUnit.SECONDS);
kecUserNameTextBox.sendKeys(“abc”);
kecPasswordTextBox.sendKeys(“123#”);
userNameTextBox.sendKeys(“a1”);
passwordTextBox.sendKeys(“1234”);
driver.findElement(By.xpath(“//div[@id='productName\u selected']]/a/span”))
。单击();
驱动程序。findElement(
By.xpath(“//div[@id='productName\u selected']/div/div/input”))
.sendKeys(“2015年数据”);
WebDriverWait wait=新的WebDriverWait(驱动程序,120);
List findElements=driver.findElements(按
.xpath(“//*[@id='productName\u selected']/div/ul/li[2]/em”);
WebElement=wait
.直到(预期条件。可选择的要素)
.xpath(“//*[@id='productName\u selected']/div/ul/li[2]/em”);
for(WebElement WebElement:findElements){
if(webElement.getText().equals(“DAT2015”)){
driver.manage().timeouts().implicitlyWait(60,TimeUnit.SECONDS);
webElement.click();
打破
}
}
试一试{
睡眠(8000);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
driver.findElement(By.xpath(“//div[@id='syttleuspath\u selected']/a/span”))
。单击();
驱动程序。findElement(
By.xpath(“//div[@id='typelupath\u selected']/div/div/input”))
。单击();
驱动程序。findElement(
By.xpath(“//div[@id='typelupath\u selected']/div/div/input”))
.sendKeys(“/DAT2015/assessment/secTests/qdatatnatscia15”);
driver.manage().timeouts().implicitlyWait(60,TimeUnit.SECONDS);
List findElements2=driver.findElements(按
.xpath(“//div[@id='音节路径_selected']/div/ul/li/em”);
WebElement element2=等待
.直到(预期条件。可选择的要素)
.xpath(“//div[@id='音节路径_selected']/div/ul/li/em”);
driver.manage().timeouts().implicitlyWait(60,TimeUnit.SECONDS);
for(WebElement WebElement:findElements2){
如果(webElement.getText().equals(
“/DAT2015/assessment/secTests/qdatoatnatsciA15”)){
driver.manage().timeouts().implicitlyWait(60,TimeUnit.SECONDS);
webElement.click();
打破
}
}
loginButton.click();
试一试{
睡眠(5000);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
driver.switchTo().defaultContent();
}
//方法2----------------------------------------------------
公众谘询文件(){
试一试{
睡眠(22000);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
驱动程序。findElement(
By.id(“subitem0.singleanswermultipleechoice.answerChoiceRow1.state0”))
。单击();
driver.findElement(By.id(“img2.simNext”))。单击();
驱动程序。findElement(
By.id(“subitem0.singleanswermultipleechoice.answerChoiceRow2.state0”))
。单击();
driver.findElement(By.id(“img2.simNext”))。单击();
驱动程序。findElement(
By.id(“subitem0.singleanswermultipleechoice.answerChoiceRow2.state0”))
。单击();
driver.findElement(By.id(“img2.simNext”))。单击();
}

等待对象出现

WebDriverWait wait;
wait.until(ExpectedConditions.refreshed(ExpectedConditions.visibilityOfElementLocated(by)));
wait.until(ExpectedConditions.refreshed(ExpectedConditions.elementToBeClickable(by)));

这些等待功能将等待对象在网页上可单击或可见

查看源代码并搜索“iframe”标记。您将使用它获得标记名,您还可以在帧之间切换。您可以使用
driver.switchTo().defaultContent()


您正在iframe中登录吗?如果是这样,您需要在使用driver.switchTo().defaultContent()成功登录后切换回默认窗口;因为当页面在那个时候切换时,页面需要一些时间来加载所有元素,selenium尝试查找元素,但元素并不总是准备好,所以您就遇到了这个问题。成功登录后,请使用用户线程。睡眠(5000)意味着5秒,或者您可以使用等待方法。您好,我尝试了上述步骤,但仍然面临相同的问题。我已经粘贴了我的代码,你能给我解决方法吗#感谢您为什么将driver.switch设置为().defaultContent();登录后?还有为什么要使用太多的隐式等待?该应用程序中存在很多同步问题,这就是为什么我要使用很多等待。注释驱动程序后。切换到().defaultContent();它也不起作用。
driver.switch_to.frame(0); //try with index 0,1