无法使用 Selenium Java 提取手风琴中的段落文本

Posted

技术标签:

【中文标题】无法使用 Selenium Java 提取手风琴中的段落文本【英文标题】:Unable to extract the paragraph text within an accordion using Selenium Java 【发布时间】:2022-01-23 01:05:11 【问题描述】:

我使用 xpath 获取段落文本,它适用于第一段,但第二段和第三段无法正常工作。它在控制台输出中显示为空。

以下字符串是我遇到的问题 - String secondAns , String thirdAns

[注意:我没有遇到任何问题,因为第二段和第三段没有找到元素]

driver.get("https://demoqa.com/widgets");
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.findElement(By.xpath("//span[text()='Accordian']")).click(); 
//clicking the left menu 
//First Paragraph
String firstques = driver.findElement(By.xpath("//div[@id='section1Heading']")).getText();
System.out.println("First Question : " + firstques); 
String firstAns = driver.findElement(By.xpath("//div[@id='section1Content']//p[1]")).getText(); 
System.out.println("First Answer : " + firstAns); 
    
//Second Paragraph
String secondques = driver.findElement(By.xpath("//div[@id='section2Heading']")).getText();
System.out.println("Second Question : " + secondques); 
String secondAns = driver.findElement(By.xpath("//div[@id='section2Content']//p[1]")).getText(); 
System.out.println("Second Answer : " + secondAns); 
    
//Third Paragraph
String thirdques = driver.findElement(By.xpath("//div[@id='section3Heading']")).getText();
System.out.println("Third Question : " + thirdques); 
String thirdAns = driver.findElement(By.xpath("//div[@id='section3Content']//p[1]")).getText(); 
System.out.println("Third Answer : " + thirdAns

【问题讨论】:

【参考方案1】:

元素位于手风琴中。在手风琴内,虽然第一个问题默认可见,但默认情况下第二个和第三个问题是折叠的。


所以要提取你必须click()的文本并打开accordion,你可以使用以下Locator Strategies:

代码块:

driver.get("https://demoqa.com/widgets");
((javascriptExecutor)driver).executeScript("scroll(0, 100)");
new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@id='section2Heading']"))).click();
System.out.println(new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@id='section2Heading']//following::div[1]/div[@id='section2Content']"))).getText());

控制台输出:

Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor sit amet..", comes from a line in section 1.10.32.
The standard chunk of Lorem Ipsum used since the 1500s is reproduced below for those interested. Sections 1.10.32 and 1.10.33 from "de Finibus Bonorum et Malorum" by Cicero are also reproduced in their exact original form, accompanied by English versions from the 1914 translation by H. Rackham.

【讨论】:

非常感谢!!!它工作正常。 我可以知道我应该如何使用 driver.executeScript("scroll(0, 100)") 吗? .我要这样添加吗? JavascriptExecutor jse = (JavascriptExecutor)驱动程序; jse.executeScript("scroll(0, 100)"); @MuthukumarGangadharan 错过了这一点,现在更新答案。让我知道状态。 @MuthukumarGangadharan 如果您有任何疑问,请随时在Selenium 房间问我。 是的,它工作正常。谢谢!!【参考方案2】:

据我所知,第二和第三段是隐藏的(未展开),因此getText() 为当前但不可见的元素重新运行一个空字符串。

在获取文本之前,您必须扩展(使其可见)元素。

尝试点击相应的手风琴标题。

【讨论】:

我试过了,但它不包含任何隐藏元素。我不知道如何在此处添加屏幕截图,否则我会添加它以供参考。 你能在得到文本之前 println driver.findElement(By.xpath("//div[@id='section2Content']//p[1]")).isDisplayed() 吗?我假设它将返回false 它现在工作正常。其他用户提到了 WebDriverWait。我试过了,现在好了。感谢您的评论。

以上是关于无法使用 Selenium Java 提取手风琴中的段落文本的主要内容,如果未能解决你的问题,请参考以下文章

使用 Selenium 提取 span 文本内容

如何使用 Selenium 和 Java 提取表格元素的 id 属性的动态值

使用 Selenium 提取嵌套元素

Python selenium从表中提取数据并单击

无法在 Selenium 和 Java 中使用 className 定位元素

如果我通过 Selenium Webdriver 和 Java 知道相应的文本,如何提取 DOM 元素的 ID 属性