Python : 使用 Selenium 获取元素

Python : Get elements using Selenium

我正在使用带有 selenium 的网站:link

我在尝试时遇到了一些问题:select 输入和输出语言、输出文本和语言类型(formel 或 informel 或 automatique)

到目前为止我的代码:

# Make imports

# Define text to translate
text_to_translate = 'hello this is me not him'

chrome_options = Options()
chrome_options.add_argument("--headless")

TARGET_LANGUAGES = ({"french": 1,
                     "english": 2,
                     "german": 3,
                     "spanish": 4,
                     "portuguese": 5,
                     "italian": 6,
                     "dutch": 7,
                     "polish": 8,
                     "russian": 9})
#input is working good 
input_text_xpath = """//*[@id="dl_translator"]/div[5]/div[2]/div[1]/div[2]/div[1]/textarea""" 
output_text_xpath = """//*[@id="dl_translator"]/div[5]/div[2]/div[3]/div[3]/div[1]/textarea"""
language_select_xpath = """//*[@id="dl_translator"]/div[1]/div[3]/div[1]/div/button/div"""
target_language_xpath = f"""//*[@id="dl_translator"]/div[1]/div[3]/div[1]/div/div/button[{target_language=TARGET_LANGUAGES["english"]}]"""
# Start a Selenium driver
driver = webdriver.Chrome(ChromeDriverManager().install(), chrome_options=chrome_options)


# Reach the deepL website
deepl_url = 'https://www.deepl.com/fr/translator'
driver.get(deepl_url)

# Get thie inupt_area
input_area = driver.find_element_by_xpath(input_text_xpath)

# Send the text
input_area.clear()
input_area.send_keys(text_to_translate)

# Wait for translation to appear on the web page
time.sleep(2)

# Get copybutton and click on it
content= driver.find_element_by_xpath(output_text_xpath).text
# Display results
print('_'*50)
print('Original    :', text_to_translate)
print('Translation :', content)
print('_'*50)

这是打开语言列表的 xpath:

//button[@dl-test='translator-source-lang-btn']

这是 select 语言的 xpath:

f"//div[@dl-test='translator-source-lang-list']/button[text()='{language}']"

这是打开转换成列表的xpath

//button[@dl-test='translator-target-lang-btn']

这是 select 翻译语言的 xpath

 f"//button[contains(@dl-test,'translator-lang-option') and text() = '{translate}']"

这是打开 formal/informal 列表的 xpath

//button[@class = 'lmt__formalitySwitch__toggler']

这是 select formal/informal 选项的 xpath。将 'Automatic' 替换为您想要的选项。

(//div[@class='lmt__formalitySwitch__menu_items']//button[text()='Automatic'])[0]

所以先点击列表,然后传入你想要的列表项select

language = 'Danish'
driver.find_element_by_xpath("//button[@dl-test='translator-source-lang-btn']").click()
driver.find_element_by_xpath(f"//div[@dl-test='translator-source-lang-list']/button[text()='{language}']").click()

输出文本

driver.find_element_by_xpath("//div[@class='lmt__textarea_container lmt__textarea_container_no_shadow']).text

目标文本在 div 而不是 textarea - 而且它还有 id 所以 xpath 是短的

'//div[@id="target-dummydiv"]'

但我无法使用

获取文本
content.text   # empty list

但我可以用

得到它
content.get_attribute('innerHTML')

因为我使用的是波兰语页面,所以我的列表中有波兰语名称 - 即。 "Angielski" 而不是 "English" 所以我不能使用列表中的名字到 select 语言,我使用

源语言

@dl-test="translator-lang-option-en"
@dl-test="translator-lang-option-fr"
@dl-test="translator-lang-option-pl"

目标语言

@dl-test="translator-lang-option-en-EN"
@dl-test="translator-lang-option-fr-FR"
@dl-test="translator-lang-option-pl-PL"

有些语言显示了我可以得到的替代翻译

'//button[@class="lmt__translations_as_text__text_btn"]'

只需要跳过空字符串即可。


结果:

__________________________________________________
Original    : hello this is me not him
Translation : Bonjour, c'est moi, pas lui.
Alternative : Bonjour, c'est moi et non lui.
Alternative : Allo, c'est moi, pas lui.
__________________________________________________

具有其他更改的完整工作代码

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
import time

# Define text to translate
source_text = 'hello this is me not him'

LANGUAGES = ({  # [source, target]
    "french":     ['fr', 'fr-FR'],
    "english":    ['en', 'en-GB'],
    "german":     ['de', 'de-DE'],
    "spanish":    ['es', 'es-ES'],
    "portuguese": ['pt', 'pt-PT'],
    "italian":    ['it', 'it-IT'],
    "dutch":      ['da', 'da-DA'],
    "polish":     ['pl', 'pl-PL'],
    "russian":    ['ru', 'ru-RU']
})

#source_xpath = '//div[@dl-test="translator-source"]'
#target_xpath = '//div[@dl-test="translator-target"]'

source_input_text_xpath  = '//textarea[@dl-test="translator-source-input"]' 
#target_input_text_xpath  = '//textarea[@dl-test="translator-target-input"]' 

#target_output_text_xpath = '//div[@id="source-dummydiv"]
target_output_text_xpath = '//div[@id="target-dummydiv"]'

source_button_xpath = '//button[@dl-test="translator-source-lang-btn"]'
target_button_xpath = '//button[@dl-test="translator-target-lang-btn"]'

lang = LANGUAGES["english"][0]   # 0 - source
source_language_xpath = f'//div[@dl-test="translator-source-lang-list"]//button[@dl-test="translator-lang-option-{lang}"]'

#lang = LANGUAGES["polish"][1]    # 1 - target
lang = LANGUAGES["french"][1]   # 1 - target
target_language_xpath = f'//div[@dl-test="translator-target-lang-list"]//button[@dl-test="translator-lang-option-{lang}"]'


# Start a Selenium driver

options = Options()
#options.add_argument("--headless")

driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)
driver.set_window_size(1400, 1200)

# Reach the deepL website
url = 'https://www.deepl.com/en/translator'   
#url = 'https://www.deepl.com/fr/translator'
#url = 'https://www.deepl.com/pl/translator'
driver.get(url)

# Select languages
driver.find_element_by_xpath(source_button_xpath).click()    # open list
time.sleep(0.1)                                              # wait for list
driver.find_element_by_xpath(source_language_xpath).click()  # click option on list (maybe it will need to scroll)

driver.find_element_by_xpath(target_button_xpath).click()    # open list
time.sleep(0.1)                                              # wait for list
driver.find_element_by_xpath(target_language_xpath).click()  # click option on list (maybe it will need to scroll)

# Select Automatic
driver.find_element_by_xpath('//button[@class="lmt__formalitySwitch__toggler"]').click()
time.sleep(0.1)
driver.find_element_by_xpath('//div[@class="lmt__formalitySwitch__menu_items"]//button[@_dl-connected="1"][3]').click()

# Get thie source inupt_area
input_area = driver.find_element_by_xpath(source_input_text_xpath)

# Send the text
input_area.clear()
input_area.send_keys(source_text)

# Wait for translation to appear on the web page
time.sleep(3)

# Get target text and alternatives
target_text = driver.find_element_by_xpath(target_output_text_xpath).get_attribute('innerHTML')
target_alternative_text = driver.find_elements_by_xpath('//button[@class="lmt__translations_as_text__text_btn"]')

# Display results
print('_'*50)
print('Original    :', source_text)
print('Translation :', target_text.strip())

for item in target_alternative_text:
    text = item.text.strip()
    if text:
        print('Alternative :', text)

print('_'*50)

结果: