В Python Selenium, как ждать, пока найдутся два элемента, и продолжить цикл - PullRequest
1 голос
/ 17 февраля 2020

Для того, чтобы получить текст, который я хочу

d1 = wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="container"]/table[1]/tbody/tr'))).text

Мне нужно дождаться загрузки либо wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'a.related-keyword-item'))), либо wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'span.related-keyword-item'))) с определенным значением текста, чтобы получить d1.

Над ky указан код для входа на страницу, моя проблема с кодом ниже ky.

Если wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'a.related-keyword-item'))) не найден, он будет ждать wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'span.related-keyword-item'))). Но я не хочу ждать 60 секунд, чтобы продолжить ожидание второго элемента, если первого элемента уже нет.

И если я добавлю более тысячи ключевых слов в ky, это будет отображаться raise TimeoutException(message, screen, stacktrace) selenium.common.exceptions.TimeoutException: Message: try

Я пытался решить эту проблему более недели, и я отчаянно нуждаюсь в ком-то чтобы выручить меня. Это мой код, и код хорошо работает только с сотнями ключевых слов в ky.

import xlrd
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException


driver = webdriver.Chrome(executable_path=r"C:\Users\Kim woo jae\PycharmProjects\100개 키워드\chromedriver.exe")
list = []
list1 = []
list2 = []
list3 = []

driver.get("https://itemscout.io/keyword/")
wait = WebDriverWait(driver, 60)
b = wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="container"]/div[2]/input')))
b.clear()
b.send_keys('화장대')
c = wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="container"]/div[2]/span')))
c.click()
d = wait.until(EC.visibility_of_element_located((By.XPATH, '//*[ @id="container"]/table[1]/tbody/tr'))).text



ky = '화장대','침대전신거울','서랍장','까사마루3단행거','옷장', '5단서랍장','6평농막'

for k in ky:
    b1 = wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="container"]/div[1]/input')))
    b1.clear()
    b1.send_keys(k)
    c1 = wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="container"]/div[1]/span')))
    c1.click()
    time.sleep(1)
    try:
        wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'a.related-keyword-item')))
    except:
        wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'span.related-keyword-item')))
    d1 = wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="container"]/table[1]/tbody/tr'))).text
    d1 = (d1).replace(',', '.')
    d1 = ' '.join(d1.splitlines())
    d1 = d1.replace(' ', ',')
    result = [x.strip() for x in d1.split(',')]

    d = [result[2]]
    s = [result[3]]
    c = [result[4]]
    print([k],d,s,c)

1 Ответ

1 голос
/ 17 февраля 2020

Вы можете использовать или , в CSS_SELECTOR. Он вернет первый, если найден, иначе второй. Он будет проверять оба извлечения DOM

wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'a.related-keyword-item, span.related-keyword-item')))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...