步骤定义Java-SeleniumWebDriver从搜索结果中查找元素
我是使用Java的Selenium Webdriver自动化新手,还在学习 在我的步骤定义RetailTakePayment.java类中,我试图查找包含特定文本的元素,该文本显示在弹出窗口的搜索结果中,但由于某些原因,我无法找到并单击它。我四处寻找,运气不太好。因此,发布我的问题以获得一些指导 我希望这些帮助 Salesforce页面车辆查找: 弹出-查找搜索结果: 我的HTML: 我的HTML中有两个框架: 我的步骤定义:步骤定义Java-SeleniumWebDriver从搜索结果中查找元素,java,selenium,webdriver,Java,Selenium,Webdriver,我是使用Java的Selenium Webdriver自动化新手,还在学习 在我的步骤定义RetailTakePayment.java类中,我试图查找包含特定文本的元素,该文本显示在弹出窗口的搜索结果中,但由于某些原因,我无法找到并单击它。我四处寻找,运气不太好。因此,发布我的问题以获得一些指导 我希望这些帮助 Salesforce页面车辆查找: 弹出-查找搜索结果: 我的HTML: 我的HTML中有两个框架: 我的步骤定义: @Given("^user complete payment
@Given("^user complete payment precheck$")
public void user_complete_payment_precheck() throws Throwable {
// inserting installer and preferred date
driver.findElement(By.id("page:frm:main:jobsInfo:jobsRepeat2:0:j_id164")).sendKeys("Test");
driver.findElement(By.xpath("/html/body/div[1]/div[2]/table/tbody/tr/td[2]/form/div[1]/div/div/div/div[2]/div[5]/div[2]/table/tbody/tr[1]/td/table/tbody/tr/td[4]/span/span")).click();
// searching and selecting vehicle
// click on lookup
driver.findElement(By.xpath("//img[@alt='Vehicle Lookup (New Window)']")).click();
Thread.sleep(2000);
// window switch handler
String parentWindowHandler = driver.getWindowHandle();
String subWindowHandler = null;
Set<String> handles = driver.getWindowHandles();
Iterator<String> iterator = handles.iterator();
while (iterator.hasNext()) {
subWindowHandler = iterator.next();
}
driver.switchTo().window(subWindowHandler);
// switch by frame
driver.switchTo().frame(0);
// searching - this worked!!!
driver.findElement(By.xpath("//form[@id='theForm']/div/div[2]/input")).sendKeys("autod2018");
Thread.sleep(1000);
driver.findElement(By.name("go")).click();
Thread.sleep(2000);
// searching for vehicle - STILL NOT WORKING....
driver.findElement(By.xpath("//div[contains(text(),'BMW-1 SERIES-AUTOd2018')]")).click();
// driver.findElement(By.xpath("/html/body/div[1]/div[3]/div/div/div[2]/div/div[2]/table/tbody/tr[2]/th/a")).click();
// switching back to the parent window - works!
driver.switchTo().window(parentWindowHandler);
// save record
driver.findElement(By.xpath("/html/body/div[1]/div[2]/table/tbody/tr/td[2]/form/div[1]/div/div/div/div[1]/table/tbody/tr/td[2]/input[1]")).click();
}
尝试了其他xpath,但全部失败:
//valid xpath-1 - from ranorex selocity - didnt work
driver.findElement(By.xpath("/html//div[@id='Vehicle__c_body']/table[@class='list']//a[@href='#']")).click();
//valid xpath-2 - custom xpath - didn't work
driver.findElement(By.xpath("//*[text()='BMW-1 SERIES-AUTOd2018']")).click();
//valid xpath-3 - from chrome - didn't work
driver.findElement(By.xpath("//*[@id=\"Vehicle__c_body\"]/table/tbody/tr[2]/th/a")).click();
//valid xpath 4 - from firefox - didn't work
driver.findElement(By.xpath("/html/body/div/div[3]/div/div/div[2]/div/div[2]/table/tbody/tr[2]/th/a")).click();
尝试:
当前代码正在查找div元素:
driver.findElement(By.xpath("//**div**[contains(text(),'BMW-1 SERIES-AUTOd2018')]")).click();
提供的html有一个元素名
<a...>BMW-1 SERIES-AUTOd2018< /a>
因为搜索表单和结果表位于不同的框架中,所以在与其中的元素交互之前,需要切换到相应的框架
// switch to search form frame
driver.switchTo().frame(0);
// enter search keywords and click go
...
// switch back to topmost frame in the current window.
// this is very important, you can't directly switch to result table frame
// from search form frame ( because it's not includes the result table frame).
// Most of time, we back to the top frame, then jump into other frame.
driver.switchTo().defaultContent();
// then switch to result table frame
driver.switchTo().frame(<index_or_name_of_result_table_frame>);
这意味着xpath不正确。您可以显示您试图定位的元素的html检查吗?您的XPath不正确。请显示您的html,以便我们可以轻松解决您的问题。谢谢,我已经添加了html的快照。您可以在键入搜索词之前切换到框架:driver.switchTo.frame0;,如果搜索结果表与搜索表单不在同一帧中,则需要切换到结果表所在的正确帧。Hi@yong,我首先切换是因为我在子帧中搜索单词。我想我以前尝试过这个方法,刚刚又做了一次,仍然找不到:org.openqa.selenium.NoSuchElementException:没有这样的元素:找不到元素:{method:xpath,selector://a[containstext,'AUTOd2018']}您在firebug中测试过xpath吗。Chrome开发者控制台运行以下命令:document.evaluate//p[containstext,'AUTOd2018',document,null,XPathResult.ANY_类型,null.iterateNextNo。不幸的是,在我的测试环境中,firefox v62 firebug不兼容。尝试firefox开发者控制台我没有机会在firefox开发者控制台中尝试它们,但我测试的那个已经过验证,我刚刚将它们添加到描述中Hi Yong,你是对的。搜索结果在单独的框架中。有两个框架“searchFrame”和“resultsFrame”。我必须切换到driver.switchTo.frame0;或driver.switchTo.framesearchFrame;在我搜索之前。但由于某些原因,我现在无法切换到结果框架。有什么建议吗?这很有效!不过我不能投票。谢谢你,杨首先切换到搜索帧驱动程序。切换到。帧搜索帧;//然后切换到最顶层的帧驱动程序。切换到。默认内容;//最后切换到结果帧驱动程序.switchTo.frameresultsFrame;如果这是您期望的答案,请接受作为您的问题答案。
<a...>BMW-1 SERIES-AUTOd2018< /a>
// switch to search form frame
driver.switchTo().frame(0);
// enter search keywords and click go
...
// switch back to topmost frame in the current window.
// this is very important, you can't directly switch to result table frame
// from search form frame ( because it's not includes the result table frame).
// Most of time, we back to the top frame, then jump into other frame.
driver.switchTo().defaultContent();
// then switch to result table frame
driver.switchTo().frame(<index_or_name_of_result_table_frame>);