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