查找跨度文本,如果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-titlegameName

的 _DIV_s
$allGames = $ChromeDriver.FindElementsByCssSelector("div.result-title.gameName")

所需的 SPANDIV 的后代,它是列表中所收集节点的兄弟 $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
        }
    }