【问题标题】:Python Selenium find element from specific div [duplicate]Python Selenium从特定div中查找元素[重复]
【发布时间】:2021-05-21 17:47:18
【问题描述】:

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


driver = webdriver.Chrome(executable_path='C:/chromedriver/chromedriver.exe')
driver.get('https://ggl-maxim.com/')

driver.find_element_by_xpath('//*[@id="body"]/div/div[2]/div/div[2]/fieldset/input[1]').send_keys('tnrud3080')
driver.find_element_by_xpath('//*[@id="body"]/div/div[2]/div/div[2]/fieldset/input[2]').send_keys('tnrud3080')
driver.find_element_by_xpath('//*[@id="body"]/div/div[2]/div/div[2]/fieldset/button[1]').click()

time.sleep(2)
driver.get('https://ggl-maxim.com/api/popup/popup_menu.asp?mobile=0&lobby=EVOLUTION')
wait = WebDriverWait(driver, 20)
wait.until(EC.frame_to_be_available_and_switch_to_it("gameIframe"))
wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, ".svg--1nrnH")))
targets = driver.find_elements_by_css_selector(".svg--1nrnH")
res = []
for el in targets:
    res.append(el.get_attribute('innerHTML'))

print(*res, sep='\n')

当您查看图片时,此代码会获取 svg(游戏记录)。但是,如果您单击底部我写“多”图片的按钮,我也可以在页面右侧看到记录。我发现这部分显示记录的速度比以前更快。为此,我必须仅从该 div 获取 svg 值。我怎样才能?请帮帮我!

【问题讨论】:

  • 检查答案。我不推荐这种解决任务的方式。

标签: python selenium


【解决方案1】:

第二种方法并不快,也更难实现,因为每个容器都是单独加载的,并在第一次加载完成后开始重新加载。自动化似乎是一场噩梦。

我尝试了 Selenium 的显式等待和 time.sleep(),这两种方法都不起作用。 下面的代码单击按钮,切换到新的 iframe 并尝试获取容器内容。但由于上述原因,内容几乎总是空的。

from selenium import webdriver
import time
from bs4 import BeautifulSoup
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


driver = webdriver.Chrome(executable_path='/snap/bin/chromium.chromedriver')
driver.get('http://ggl-maxim.com/')

driver.find_element_by_xpath('//*[@id="body"]/div/div[2]/div/div[2]/fieldset/input[1]').send_keys('tnrud3080')
driver.find_element_by_xpath('//*[@id="body"]/div/div[2]/div/div[2]/fieldset/input[2]').send_keys('tnrud3080')
driver.find_element_by_xpath('//*[@id="body"]/div/div[2]/div/div[2]/fieldset/button[1]').click()

time.sleep(2)
driver.get('http://ggl-maxim.com/api/popup/popup_menu.asp?mobile=0&lobby=EVOLUTION')
wait = WebDriverWait(driver, 30)
wait.until(EC.frame_to_be_available_and_switch_to_it("gameIframe"))
wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, ".svg--1nrnH")))
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "span[data-role=button-label]"))).click()

wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".sidebar-container>iframe")))
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".sidebar-container")))
iframe2 = driver.find_element_by_css_selector('iframe[src^="https://evo.kplaycasino.com/frontend/evo/r2/"]')
driver.switch_to.frame(iframe2)
# wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".list--BLuiJ .svg--1nrnH")))
time.sleep(20)
targets = driver.find_elements_by_css_selector(".list--BLuiJ .svg--1nrnH")
res = []
for el in targets:
    res.append(el.get_attribute('innerHTML'))
print(*res, sep='\n')

如您所见,即使 20 秒也不够,因为内容正在重新加载。

我留下了明确的等待评论,所以你可以放心它不会工作。

但是,从我的回答中,您可以了解如何找到以特定文本开头的定位器:

iframe2 = driver.find_element_by_css_selector('iframe[src^="https://evo.kplaycasino.com/frontend/evo/r2/"]')

其中,src^=表示 src 以某些指定文本开头。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 2021-04-04
    • 1970-01-01
    • 2014-07-18
    • 2018-02-07
    • 1970-01-01
    相关资源
    最近更新 更多