查找跨度文本,如果parentdiv文本有一定的值
Find the span text, if parent div text has certain value
我绝不是开发人员。我通过了 google,但是这个问题的深度我不明白。
如果您能解释一下我在编程知识方面的不足,将不胜感激。
使用 powershell,我可以从我选择的 div 中获取所有 .Text。
但是我无法弄清楚如何从 div 中找到文本,其 .Text 是“abc”
$allGames.Text 包含所有游戏名称,到目前为止还不错:
[System.Reflection.Assembly]::LoadFrom("{0}\WebDriver.dll" -f $PathToFolder)
if ($env:Path -notcontains ";$PathToFolder" ) {
$env:Path += ";$PathToFolder"
}
$ChromeOptions = New-Object OpenQA.Selenium.Chrome.ChromeOptions
$ChromeOptions.AddArgument('start-maximized')
$ChromeDriver = New-Object OpenQA.Selenium.Chrome.ChromeDriver($ChromeOptions)
$ChromeDriver.Url = $uri
#sometimes site is slow, 5s should be enough
Start-Sleep -Seconds 5
$allGames = $ChromeDriver.FindElementsByCssSelector("div.result-title.gameName")
里面是我要检索的文本。
nor 的名字都不是唯一的。有数百个 divs 和 span 具有相同的名称。所以我不能直接访问它们。
我只想要 span 中的文本,如果它的 div 有文本“abc”
我对 powershell 的基本了解告诉我这样做
foreach ($game in $allGames) {
$game.GetType() #=RemoteWebElement
if ($game.Text -eq "abc") {
Write-Host "Found something!"
$span = $game.FindElementsByCssSelector("span.search-listing-count-text")
$span.Text
}
}
然而 $span 不包含任何内容
我不明白是我没能理解 Selenium(我什至不知道它是什么。Google 告诉我可以用它在网站上查找资料)或者我是否我没能理解 powershell 面向 object 的方面(我不理解 :))
我错过了什么?
html 片段:
<div class="search-results">
<div class="result-title gameName">abc
</div>
<div class="result-info">
<span class="search-listing-count-text">123
</span>
</div>
</div>
您的问题:
你找到带有 abc 的 div
比你需要返回 1 级到:
然后你想找到你的div。
您搜索的 div 不是 abc div
的子代
CssSelector 并且返回不是一个选项,所以我使用了 Xpath(Google Xpath 了解更多信息)。也许您需要使用“/..//”(删除第一个。)
$span = $game.FindElementByXPath("./..//span[@class='search-listing-count-text']")
注意:运行 来自 powershell 的 selenium,这对我来说是新的,每天都在学习。不错!
重建 HTML 你将得到:
<div class="search-results">
<div class="result-title gameName">abc</div>
<div class="result-info">
<span class="search-listing-count-text">123</span>
</div>
</div>
现在,allGames
将包含具有类名 result-title
和 gameName
的 _DIV_s
$allGames = $ChromeDriver.FindElementsByCssSelector("div.result-title.gameName")
所需的 SPAN 是 DIV 的后代,它是列表中所收集节点的兄弟 $allGames
.
解决方案
为了 select 相对于列表 $allGames
中的节点所需的 SPAN,您可以使用以下 :
XPath:
foreach ($game in $allGames) {
$game.GetType() #=RemoteWebElement
if ($game.Text -eq "abc") {
Write-Host "Found something!"
$span = $game.FindElementByXPath("//ancestor::div[1]//div[@class='result-info']/span")
$span.Text
}
}
我绝不是开发人员。我通过了 google,但是这个问题的深度我不明白。
如果您能解释一下我在编程知识方面的不足,将不胜感激。
使用 powershell,我可以从我选择的 div 中获取所有 .Text。 但是我无法弄清楚如何从 div 中找到文本,其 .Text 是“abc”
$allGames.Text 包含所有游戏名称,到目前为止还不错:
[System.Reflection.Assembly]::LoadFrom("{0}\WebDriver.dll" -f $PathToFolder)
if ($env:Path -notcontains ";$PathToFolder" ) {
$env:Path += ";$PathToFolder"
}
$ChromeOptions = New-Object OpenQA.Selenium.Chrome.ChromeOptions
$ChromeOptions.AddArgument('start-maximized')
$ChromeDriver = New-Object OpenQA.Selenium.Chrome.ChromeDriver($ChromeOptions)
$ChromeDriver.Url = $uri
#sometimes site is slow, 5s should be enough
Start-Sleep -Seconds 5
$allGames = $ChromeDriver.FindElementsByCssSelector("div.result-title.gameName")
里面是我要检索的文本。 nor 的名字都不是唯一的。有数百个 divs 和 span 具有相同的名称。所以我不能直接访问它们。
我只想要 span 中的文本,如果它的 div 有文本“abc”
我对 powershell 的基本了解告诉我这样做
foreach ($game in $allGames) {
$game.GetType() #=RemoteWebElement
if ($game.Text -eq "abc") {
Write-Host "Found something!"
$span = $game.FindElementsByCssSelector("span.search-listing-count-text")
$span.Text
}
}
然而 $span 不包含任何内容
我不明白是我没能理解 Selenium(我什至不知道它是什么。Google 告诉我可以用它在网站上查找资料)或者我是否我没能理解 powershell 面向 object 的方面(我不理解 :))
我错过了什么?
html 片段:
<div class="search-results">
<div class="result-title gameName">abc
</div>
<div class="result-info">
<span class="search-listing-count-text">123
</span>
</div>
</div>
您的问题: 你找到带有 abc 的 div 比你需要返回 1 级到: 然后你想找到你的div。 您搜索的 div 不是 abc div
的子代CssSelector 并且返回不是一个选项,所以我使用了 Xpath(Google Xpath 了解更多信息)。也许您需要使用“/..//”(删除第一个。)
$span = $game.FindElementByXPath("./..//span[@class='search-listing-count-text']")
注意:运行 来自 powershell 的 selenium,这对我来说是新的,每天都在学习。不错!
重建 HTML 你将得到:
<div class="search-results">
<div class="result-title gameName">abc</div>
<div class="result-info">
<span class="search-listing-count-text">123</span>
</div>
</div>
现在,allGames
将包含具有类名 result-title
和 gameName
$allGames = $ChromeDriver.FindElementsByCssSelector("div.result-title.gameName")
所需的 SPAN 是 DIV 的后代,它是列表中所收集节点的兄弟 $allGames
.
解决方案
为了 select 相对于列表 $allGames
中的节点所需的 SPAN,您可以使用以下
XPath:
foreach ($game in $allGames) { $game.GetType() #=RemoteWebElement if ($game.Text -eq "abc") { Write-Host "Found something!" $span = $game.FindElementByXPath("//ancestor::div[1]//div[@class='result-info']/span") $span.Text } }