我正在尝试获取 Twitter 中登录错误消息的文本。
Twitter 这部分的 HTML 代码:
<div class="message-inside">
<span class="message-text">The email or password doesn't match.</span>
</div>
然后我使用了:
String message = driver.findElement(By.xpath("/html/body/div[2]/div/div/span")).getText();
其中xpath是Mozilla的inspect元素给出的xpath。但是,String 消息是空的。
PS: 在调用 getText 的那一刻,消息没有被隐藏,所以我不认为这是问题所在
编辑:我也尝试了 .getAttribute("innerHTML") 而不是 .getText(),但同样失败了
最佳答案
永远不要用 sleep 解决此类问题:它不可靠(如果元素比 sleep 长度晚 1 毫秒出现怎么办?)并且会减慢您的测试速度(如果元素在 sleep 开始后 10 毫秒出现怎么办?您浪费了 990 毫秒,并且在许多测试中它加起来了) .
相反,使用显式等待模式来等待文本出现:
WebDriverWait wait = new WebDriverWait(driver, 10); // wait for max 10 sec
String message = wait.until(ExpectedConditions. visibilityOfElementLocated(By.xpath("/html/body/div[2]/div/div/span")).getText();
通过这种方式,您可以告诉 selenium 最多等待 10 秒的元素,但如果元素在此之前出现,它将返回得更快。
另一件事:像 /html/body/div[2]/div/div/span
这样的 xpath 不是你通常应该使用的东西(有些情况是不可避免的,但很少见)。为什么:
- 首先从路径上看,你无法判断你选择的是什么。因此,如果 HTML 发生变化,您将很难弄清楚这条语句之前做了什么。
- 按索引选择(例如
div[2]
)是非常容易崩溃的:只要再多一个 div 出现在您选择的那个之上,您的 xpath 就会崩溃 - 您很少需要选择绝对路径。专注于重要的部分。
例如,您要选择的内容在 Twitter 上看起来像这样:
<div class="alert-messages" id="message-drawer" style="top: -40px;">
<div class="message ">
<div class="message-inside">
<span class="message-text"></span>
</div>
</div>
</div>
所以一个更有意义的 xpath 应该是
//div[@id='message-drawer']//span[@class='message-text']
它告诉您正在查看页面的哪一部分 - message-drawer
(id
最适合识别事物 - 它始终是唯一的)。您对该部分中的哪个元素感兴趣。就是这样。如果页面上的任何内容发生变化,您大多不会在意。即使您这样做,xpath 也会清楚地告诉您您选择的目的,因此更容易理解它的含义。
关于java - Twitter 中的 Get.text(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53508084/