【问题标题】:Find the span text, if parent div text has certain value查找跨度文本,如果父 div 文本具有特定值
【发布时间】:2022-01-10 05:46:24
【问题描述】:

我绝不是开发人员。我是通过谷歌得到的,但这个问题的深度我不明白。

如果您能解释我在编程知识方面缺乏什么,将不胜感激。

使用 powershell,我可以从我选择的任何 div 中获取所有 .Text。 但是我不知道如何从 .Text 为“abc”的 div 中找到文本

$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") 

里面是我要检索的文本。 的名字也不是唯一的。有数百个具有相同名称的 div 和 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 的面向对象方面(我不这样做:))

我错过了什么?

html sn-p:

<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>

【问题讨论】:

    标签: powershell selenium selenium-webdriver xpath selenium-chromedriver


    【解决方案1】:

    重建您将获得的 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 中收集的节点的兄弟。


    解决方案

    要针对$allGames 列表中的节点选择所需的 SPAN,您可以使用以下 Locator Strategy

    • 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
          }
      }
      

    【讨论】:

    • 第二天醒来时,我尝试了 $span = $game.FindElementByXPath("./following::span") 并且成功了!现在我想在新的迷你项目中做类似的事情。但是 ./following 总是把我带到我的 div 之外。而且我一生都无法弄清楚为什么,因为我有另一个脚本在做完全相同的事情。记住了这篇文章,我从来没有看到我的游戏名 div 在我的跨度之前被关闭了!这一认识也帮助我解决了新问题。非常感谢!
    【解决方案2】:

    你的问题: 你用 abc 找到 div 比您需要返回 1 级: 然后你想找到你的div。 您搜索的 div 不是 abc div 的子代

    CssSelector 和返回不是一个选项,所以我使用了 Xpath(Google Xpath 获取更多信息)。也许您需要使用“/..//”(删除第一个。)

    $span = $game.FindElementByXPath("./..//span[@class='search-listing-count-text']")
    

    注意:从 powershell 运行 selenium,这对我来说是新的,每天都在盯着看。不错!

    【讨论】:

    • " 您搜索的 div 不是 abc div 的子级" 哈哈是的,我从来没有意识到。感谢您的提示,帮助我解决了上面评论中提到的另一个问题!我已经转向 python 进行新的个人项目。认为了解其中的一些基础知识可能会有用。虽然当我没有在我的函数中指定类型时,我发现很难从 vscode 获得提示,但我不理解类和东西,所以这很困难。我跑题了。再次感谢!
    猜你喜欢
    • 2021-09-14
    • 2016-01-18
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多