python-3.x - Selenium - 文本属性仅在调试器检查后才可用

标签 python-3.x selenium xpath css-selectors webdriverwait

我正在与基于 Selenium 的 Python 3 网络抓取工具中的意外行为作斗争,并想了解发生了什么:

我正在解析带有工作机会的网站。在最初的搜索之后,我得到了 1 到 n 个结果站点。这个数量的站点在第一页显示为“m-pagination__meta”元素的文本部分,并以德语显示,例如“1 冯 48”。我需要这个字符串进行进一步处理。它在网站上,它不是 iframe 的一部分。

Sample link of job website

的HTML:

<div class="m-pagination">
  <div class="m-pagination__inner m-pagination__inner--borderBottom">
    <button class="m-pagination__button m-pagination__button--disabled" data-page="" data-event-action="click: pagination-first">
      <svg viewBox="0 0 17 17" width="0" height="0" class="m-icon m-icon--large ">
        <g fill="none" stroke="currentColor" stroke-width=".7" stroke-linecap="round" stroke-linejoin="round">
          <path d="M9 13.2L4.2 8.5 9 3.8"></path>
          <path d="M12.8 13.2L8 8.5l4.7-4.7"></path>
        </g>
      </svg>
    </button>
    <button class="m-pagination__button m-pagination__button--previous m-pagination__button--disabled" data-page="false" data-event-action="click: pagination-previous">
      <svg viewBox="0 0 17 17" width="0" height="0" class="m-icon m-icon--large ">
        <path fill="none" stroke="currentColor" stroke-width=".8" stroke-linecap="round" stroke-linejoin="round" d="M10.9 3.8L6 8.6l4.7 4.6"></path>
      </svg>
    </button>
    <span class="m-pagination__meta" data-number="1"> 1 von 43 </span> 
    <button class="m-pagination__button m-pagination__button--next m-pagination__button--available" data-page="2" data-event-action="click: pagination-next">
      <svg viewBox="0 0 17 17" width="0" height="0" class="m-icon m-icon--large ">
        <path fill="none" stroke="currentColor" stroke-width=".7" stroke-linecap="round" stroke-linejoin="round" d="M6.1 3.8L11 8.6l-4.7 4.6"></path>
      </svg>
    </button>
  </div>
</div>

现在是奇怪的部分:当我调试程序并尝试使用“m-pagination__meta”.text 直接访问字符串元素时,它返回一个空字符串。

然而,当我访问母元素对象 m-pagination__meta 并使用调试器检查它时,向下滚动到文本属性时,预期的“1 von 48”字符串就在那里。在此检查之后,我可以访问具有预期结果的“m-pagination__meta”.text。

这种行为似乎不依赖于时间。我试图用类似的代码等待所需元素的存在

wait = WebDriverWait(self.driver, 10)
wait.until(EC.text_to_be_present_in_element((By.CLASS_NAME,"m-pagination__meta"), "1 von 48"))
pagesTotal = int(self.driver.find_element_by_class_name("m-pagination__meta").text.split(" ")[2])

无济于事(当然,当我不知道它会产生哪个字符串时,我意识到搜索特定字符串是愚蠢的,但我不知道如何编写它。)

我还尝试了使用 sleep 的“正常”等待,但似乎没有任何效果,只有调试器中提到的检查,这对于生产目的是无用的。

我真的很想了解这里发生了什么。

最佳答案

vertical scroll bar present 将页面分为两部分。但是您需要先找到左侧滚动条元素,然后执行 location_once_scrolled_into_view .一旦你达到,你可以识别你所追求的元素。

试试下面的代码。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver=webdriver.Chrome()
driver.get('https://www.karriere.at/jobs/programmierer/wien')
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='c-jobsSearch__listing']"))).location_once_scrolled_into_view
print(driver.find_element_by_xpath("//span[@class='m-pagination__meta']").get_attribute('innerText'))

关于python-3.x - Selenium - 文本属性仅在调试器检查后才可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56702428/

相关文章:

python-3.x - 使用exchangelib访问Outlook Exchange服务器阅读邮件时出现403错误

python - 方法作为字符串存储到运行的方法中

c# - 编写自动化测试时处理 Try Catch 的最佳实践是什么?

java - 如何等待 css 属性更改?

python - 像下面这样的字符串操作是否在 python 中使用了额外的空间?

python-3.x - 在进程之间共享 NetworkX 图,无需额外内存成本(只读)

.net - 如果断言失败之前的场景,SpecFlow 将跳过场景

c - libxml2 和 XPath 在 ANSI C 中遍历 child 和 sibling

xml - XPath 返回同一级别上的所有元素

python - 如何获取我之前使用其类找到的图像的 xpath?