Selenium 有文字时找不到文字

问题描述

Traceback (most recent call last):
  File "c:\Users\noah4273\Downloads\Python\app.py",line 22,in <module>
    x = driver.find_element_by_id("Label_Spg").text()[0]
TypeError: 'str' object is not callable

当我尝试将一些文本放入变量时出现此错误,奇怪的是那里有一个字符串?代码如下:

from selenium import webdriver
import pyautogui as pay
import time

PATH = r"C:\Users\noah4273\Downloads\Python\chromedriver.exe"
driver = webdriver.Chrome(PATH)


driver.get("https://emat4.dk/menu.aspx")
driver.find_element_by_id("ctl00_ImageButton_UNILogin").click()
time.sleep(1)
pay.write("noah4273")
pay.press("Enter")
time.sleep(1)
pay.write("hejmeddig")
pay.press("Enter")
time.sleep(3)
driver.find_element_by_id("ctl00_ImageButton_Tabeltræning").click()
driver.find_element_by_id("ctl00_ContentPlaceHolder1_ImageButton_StartTabel").click()
driver.find_element_by_id("ctl00_ContentPlaceHolder1_ImageButton_Let").click()
driver.find_element_by_class_name("nrknap").click()
x = driver.find_element_by_id("Label_Spg").text()[0]
y = driver.find_element_by_id("Label_Spg").text()[4]

idk = int(x) * int(y)
pay.write(idk)
pay.press("Enter")

错误x = 和 **y = **

这也是html的东西

<label id="Label_Spg" style="font-size: 48pt; -moz-user-select: -moz-none; -khtml-user-select: none; -webkit-user-select: none; -o-user-select: none; user-select: none;">10 • 4</label>

解决方法

text 是节点的字符串属性,所以你只需要 text 而不是 text()

,

driver.find_element_by_id("Label_Spg").text() 是一个字符串(不是数组),所以附加 [0] 或者你有什么是没有意义的。我希望您正在寻找:

x = driver.find_elements_by_id("Label_Spg")[0].text
y = driver.find_elements_by_id("Label_Spg")[4].text

我对你的目标有误。对于您当前的错误,driver.find_element_by_id("ctl00_ImageButton_UNILogin").click() 未找到任何元素。我怀疑您需要等待该元素才能尝试与其交互。

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

PATH = r"C:\Users\noah4273\Downloads\Python\chromedriver.exe"
driver = webdriver.Chrome(PATH)


element = driver.get("https://emat4.dk/menu.aspx")
element = WebDriverWait(driver,20).until(
EC.element_to_be_clickable((By.ID,"ctl00_ImageButton_UNILogin")))

element.click();
,

您处理获得的文本的方式看起来令人困惑。 试试这个方法:

x = driver.find_element_by_id("Label_Spg")
text_fromX = x.text
y = driver.find_element_by_id("Label_Spg")
text_fromY = y.text

如果需要对得到的字符串进行操作,切出想要的数字,就去做吧。随后将这些值转换为浮点数或整数。

-编辑:补充我的答案,因为 id 是相同的(在您显示的代码中),只创建一个变量来存储此文本会更正确,然后执行字符串切片并分隔所需的数字(将它们转换为 int 或 float)。

,

现在我明白你想要什么了。

text = driver.find_element_by_id("Label_Spg").text
x = text[0]
y = text[-1]

说明:
driver.find_element_by_id("Label_Spg") 返回一个网络元素 在其上应用 .text 会检索该网络元素文本。这是一个字符串。
现在,获取字符串的第一个和最后一个字符如下所示