如何访问 Span class 或 Selenium Python 中的元素

How to access Span class or element in Selenium Python

您好,我正在尝试访问此元素跨度。我想以一种可以附加到列表的方式访问它。每个跨度都有一个 wordnr="1" 或任何数字。我希望每个 wordnr 都进入列表。

这是网站源代码的样子

<div id="row1" style="top: 1px;"><span wordnr="0" class="highlight">who</span> <span wordnr="1" class="">other</span> <span wordnr="2" class="">even</span> <span wordnr="3" class="">study</span> <span wordnr="4" class="">near</span> <span wordnr="5" class="">put</span> <span wordnr="6" class="">did</span> <span wordnr="7" class="">up</span> <span wordnr="8" class="">small</span> <span wordnr="9" class="">white</span> <span wordnr="10" class="">go</span> <span wordnr="11" class="">call</span> <span wordnr="12" class="">the</span> <span wordnr="13" class="">big</span> <span wordnr="14" class="">she</span> <span wordnr="15" class="">example</span> <span wordnr="16" class="">part</span> <span wordnr="17" class="">those</span> <span wordnr="18" class="">mean</span> <span wordnr="19" class="">plant</span> <span wordnr="20" class="">down</span> <span wordnr="21" class="">just</span> <span wordnr="22" class="">school</span> <span wordnr="23" class="">still</span> <span wordnr="24" class="">only</span> <span wordnr="25" class="">went</span> <span wordnr="26" class="">thing</span> <span wordnr="27" class="">soon</span> <span wordnr="28" class="">make</span> <span wordnr="29" class="">small</span> <span wordnr="30" class="">when</span> <span wordnr="31" class="">at</span> <span wordnr="32" class="">such</span> <span wordnr="33" class="">work</span> <span wordnr="34" class="">together</span> <span wordnr="35" class="">world</span> <span wordnr="36" class="">like</span> <span wordnr="37" class="">want</span> <span wordnr="38" class="">really</span> <span wordnr="39" class="">her</span> <span wordnr="40" class="">show</span> <span wordnr="41" class="">turn</span> <span wordnr="42" class="">such</span> <span wordnr="43" class="">over</span> <span wordnr="44" class="">hard</span> <span wordnr="45" class="">place</span>

这是我的代码,它没有意义,因为我不知道如何访问或找到它。我使用的是 Repl.it,所以看起来有点混乱。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options

list=[]

chrome_options = Options()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')

driver = webdriver.Chrome(options=chrome_options)


driver.get("https://10fastfingers.com/typing-test/english")

words= driver.find_element_by_xpath("//span[@class='wordnr'/span[0]]").text

看看这是否有效:-

list = []
words = driver.find_elements_by_xpath("//div[@id='row1']/span")
for e in words:
    list.append(e.get_attribute("wordnr"))

有一个接受 all cookies 按钮。你必须点击它。下面是示例代码:

代码:

driver.maximize_window()
driver.get("https://10fastfingers.com/typing-test/english")
wait = WebDriverWait(driver, 10)
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a[id='CybotCookiebotDialogBodyLevelButtonLevelOptinAllowAll']"))).click()
sleep(5)
for name in driver.find_elements(By.XPATH, "//span[@wordnr]"):
    print(name.get_attribute('wordnr'))

进口:

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

我认为以下应该可行。
等到页面加载完毕,获取相关元素的列表,然后从每个元素中提取文本并将其附加到列表中

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

chrome_options = Options()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')

driver = webdriver.Chrome(options=chrome_options)
wait = WebDriverWait(driver, 20)

driver.get("https://10fastfingers.com/typing-test/english")
texts_list=[]
#wait for first element presence
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "span[wordnr]")))
#wait for the rest elements loaded
time.sleep(1)

elements = driver.find_elements_by_css_selector("span[wordnr]")
for element in elements:
    texts_list.append(element.text)

1 有“接受cookies”按钮。在获取文本之前单击它。

2 要获取文本,请使用 item.get_attribute("innerHTML")。不确定为什么 item.text 不适用于您的情况。待会儿再看看,真有趣

3 Selenium 使用 my_list = driver.find_elements_by_css_selector("#row1>span[wordnr]") 为您创建一个列表您不需要创建额外的列表并向其附加值。此外,在您的情况下这样做可能会导致包含内部列表的列表。

4 使用正确的显式等待。 visibility_of_all_elements_located 将不起作用,因为文本仅部分可见。

5尽量不要使用list这样的标识符。这可能是代码可读性的问题。在此处查看有趣的问题 Better Python list Naming Other than "list"我的解决方案

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


chrome_options = Options()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')

driver = webdriver.Chrome(executable_path='/snap/bin/chromium.chromedriver', options=chrome_options)


driver.get("https://10fastfingers.com/typing-test/english")
wait = WebDriverWait(driver, 20)

#wait for first element presence
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#CybotCookiebotDialogBodyLevelButtonLevelOptinAllowallSelectionWrapper>#CybotCookiebotDialogBodyLevelButtonLevelOptinAllowAll"))).click()

wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "span[wordnr]")))
my_list = driver.find_elements_by_css_selector("#row1>span[wordnr]")
print(len(my_list))
for item in my_list:
    print(item.get_attribute("innerHTML"))

示例输出

385
keep
country
been
their
food
do
...

打印整个列表(385 个单词)。