您如何使用 Selenium 检查属性的存在并获取其值(如果存在)?

Posted

技术标签:

【中文标题】您如何使用 Selenium 检查属性的存在并获取其值(如果存在)?【英文标题】:How do you check the presence of an attribute with Selenium and get its value if it is here? 【发布时间】:2020-09-23 16:41:33 【问题描述】:

我在a google form survey 上进行迭代并尝试添加一些内容(为了以防万一,我尝试使其看起来像引用)。但是有些字段是年龄,不允许超过 99 岁这样:

<input type="text" class="quantumWizTextinputPaperinputInput exportInput" jsname="YPqjbf" autocomplete="off" tabindex="0" aria-label="Age" aria-describedby="i.desc.504994172 i.err.504994172" name="entry.128750970" value="" min="18" max="99" required="" dir="auto" data-initial-dir="auto" data-initial-value="10102015" badinput="false" aria-invalid="true">

所以我在我的代码中添加了一个条件来尝试查看我必须写入的元素上是否存在“max”属性:

        content_areas = driver.find_elements_by_class_name(
            "quantumWizTextinputSimpleinputInput.exportInput"
        )
        for content_area in content_areas:
            if content_area.get_attribute("max") exists:
                max = content_area.get_attribute("max")
                content_area.send_keys(max)
            else:
                content_area.send_keys("10102015")

但它不起作用:

max:
Traceback (most recent call last):
  File "questions_scraper_michael.py", line 151, in <module>
    result = extract(driver, df, column)
  File "questions_scraper_michael.py", line 70, in extract
    "freebirdFormviewerViewNumberedItemContainer"
  File "C:\Users\antoi\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\selenium\webdriver\remote\webdriver.py", line 580, in find_elements_
by_class_name
    return self.find_elements(by=By.CLASS_NAME, value=name)
  File "C:\Users\antoi\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\selenium\webdriver\remote\webdriver.py", line 1007, in find_elements

    'value': value)['value'] or []
  File "C:\Users\antoi\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Users\antoi\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\selenium\webdriver\remote\errorhandler.py", line 241, in check_respo
nse
    raise exception_class(message, screen, stacktrace, alert_text)
selenium.common.exceptions.UnexpectedAlertPresentException: Alert Text: Alert text :
Message: unexpected alert open: Alert text : 
  (Session info: chrome=83.0.4103.61)

【问题讨论】:

【参考方案1】:

尝试下面的css 选择器来识别该页面上的所有input 元素,然后迭代循环。

driver.get('https://docs.google.com/forms/d/e/1FAIpQLSe-ebOztdB6T4ZgtsOYuvbUR5qwSTfI5CnJB1mNLeNflCVX8Q/viewform')
content_areas=driver.find_elements_by_css_selector("input.exportInput")
for content_area in content_areas:
    if content_area.get_attribute("max"):
        max = content_area.get_attribute("max")
        content_area.send_keys(max)
    else:
        content_area.send_keys("10102015")

浏览器快照。

【讨论】:

【参考方案2】:

我觉得你的解决方案应该是这样的

  content_areas = driver.find_elements_by_class_name(
            "quantumWizTextinputSimpleinputInput.exportInput"
        )
        for content_area in content_areas:
            if content_area.get_attribute("max") and not content_area.get_attribute("max").isspace():
                max = content_area.get_attribute("max")
            else:
                content_area.send_keys("10102015")

【讨论】:

感谢您的回答,我猜双点content_area.. 是错字?不幸的是,即使没有它,它也不允许我获得这个属性。我提供了一个完整链接,指向我正在抓取的网页。这是一个谷歌表单。【参考方案3】:

总而言之,您的测试涉及:

检查max 属性是否存在。 如果存在此类元素,则检索 max 属性的值。

理想情况下,max 属性指定&lt;input&gt; 元素的最大值。所以你需要为visibility_of_all_elements_located()诱导WebDriverWait,你可以使用以下Locator Strategies之一:

使用CSS_SELECTOR

driver.get('https://docs.google.com/forms/d/e/1FAIpQLSe-ebOztdB6T4ZgtsOYuvbUR5qwSTfI5CnJB1mNLeNflCVX8Q/viewform')
print([my_elem.get_attribute("max") for my_elem in WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "input.quantumWizTextinputPaperinputInput.exportInput[max]")))])

使用XPATH

driver.get('https://docs.google.com/forms/d/e/1FAIpQLSe-ebOztdB6T4ZgtsOYuvbUR5qwSTfI5CnJB1mNLeNflCVX8Q/viewform')
print([my_elem.get_attribute("max") for my_elem in WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.XPATH, "//input[@class='quantumWizTextinputPaperinputInput exportInput' and @max]")))])

控制台输出:

['99']

注意:您必须添加以下导入:

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

【讨论】:

@RevolucionforMonica 很高兴能为您提供帮助。 Upvote 如果此/任何答案对您/对您有帮助,则为未来读者的利益提供答案。【参考方案4】:

python 中没有“exists”命令。 你应该删除它。

for content_area in content_areas:
    if content_area.get_attribute("max"):
        max = content_area.get_attribute("max")
    else:
        content_area.send_keys("10102015")

【讨论】:

感谢您的关注,我写它只是为了提到它必须是可访问的。不幸的是,在您的帮助下,我还无法获得它。我将提供网页的网址,这是一项谷歌表单调查

以上是关于您如何使用 Selenium 检查属性的存在并获取其值(如果存在)?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用selenium Webdriver验证页面中是否存在重复文本

如何使用 Selenium Java 获取网站代码而不是 HTML 源代码

Room:如何检查行是不是存在

如果'checked'属性不可用于使用isChecked / isSelected,如何使用selenium检查复选框的状态? [复制]

Selenium webdriver:如何找到元素的所有属性?

Selenium Xpath for Salesforce 页面复选框 - “选中”属性不存在