无法选中webdriver中的复选框,Chrome python

hl0ma9xz  于 2022-12-20  发布在  Go
关注(0)|答案(2)|浏览(151)

我正在尝试创建一个脚本来只显示singapore poke map上的皮卡丘,剩下的代码是检查元素,获取它的坐标,并打印列表。我尝试了很长时间,我在这里看到的许多建议,但仍然无法使复选框设置为最新的代码:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
import time

def find_pokemon():
    links = []
    service = ChromeService(ChromeDriverManager().install())
    driver = webdriver.Chrome(service=service)
    driver.get('https://sgpokemap.com/index.html?fbclid=IwAR2p_93Ll6K9b923VlyfaiTglgeog4uWHOsQksvzQejxo2fkOj4JN_t-MN8')
    driver.find_element(By.ID, 'filter_link').click()
    driver.find_element(By.ID, 'deselect_all_btn').click()
    driver.find_element(By.ID, 'search_pokemon').send_keys("pika")
    driver.switch_to.frame(driver.find_elements(By.ID, "filter"))
    driver.find_element(By.ID, 'checkbox_25').click()

代码的第二部分在放置断点并忽略复选框click()异常后手动选中复选框时正常工作。
你有什么建议我可以试试吗?
附加问题,我如何确定并关闭捐赠视图:

piok6c0g

piok6c0g1#

您的代码存在以下几个问题:
1.没有ID为'search_pokemon'的元素
1.那里没有可切换到它的帧。
1.您需要使用WebDriverWaitexpected_conditions来等待可单击的元素。
1.一般来说,你需要学习如何创建正确的定位器。
下面的代码是有效的:

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

options = Options()
options.add_argument("start-maximized")

webdriver_service = Service('C:\webdrivers\chromedriver.exe')
driver = webdriver.Chrome(options=options, service=webdriver_service)
wait = WebDriverWait(driver, 30)

url = "https://sgpokemap.com/index.html?fbclid=IwAR2p_93Ll6K9b923VlyfaiTglgeog4uWHOsQksvzQejxo2fkOj4JN_t-MN8"
driver.get(url)

try:
    wait.until(EC.element_to_be_clickable((By.ID, 'close_donation_button'))).click()
except:
    pass

wait.until(EC.element_to_be_clickable((By.ID, 'filter_link'))).click()
wait.until(EC.element_to_be_clickable((By.ID, "deselect_all_btn"))).click()
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "[name='search_pokemon']"))).send_keys("pika")
wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@class='filter_checkbox'][not(@style)]//label"))).click()

结果是:

统一采购司

1.这次我看到了捐赠对话框,所以我添加了关闭它的机制。
1.我仍然看不到你提到的ID = 'search_pokemon'元素。
1.关于XPath找到相关的复选框-当口袋妖怪的名字被插入时,你可以在开发工具中看到有很多复选框,但是它们都是不可见的,而在我们的例子中只有一个是可见的。不可见的元素都有style="display: none;"属性,而启用的元素没有style属性。这就是为什么[not(@style)]出现在那里。所以,我正在寻找父元素//div[@class='filter_checkbox']谁也没有style属性。在XPath的话//div[@class='filter_checkbox'][not(@style)]然后我只是寻找它label子点击它。这也可以用CSS选择器以及。
包含启用元素的不可见元素列表:

axr492tv

axr492tv2#

在@Prophet的帮助和答案下,爬行Map并获取所有皮卡丘坐标的当前代码如下:

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

from keep import saveToKeep

def find_pokemon():
    links = []
    options = Options()
    options.add_argument("--headless")
    options.add_argument("disable-infobars")
    webdriver_service = Service('C:\webdrivers\chromedriver.exe')
    driver = webdriver.Chrome(options=options, service=webdriver_service)
    wait = WebDriverWait(driver, 30)

    driver.get('https://sgpokemap.com')
    try:
        wait.until(EC.element_to_be_clickable((By.ID, 'close_donation_button'))).click()
    except:
        pass
    wait.until(EC.element_to_be_clickable((By.ID, 'filter_link'))).click()
    wait.until(EC.element_to_be_clickable((By.ID, "deselect_all_btn"))).click()
    wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "[name='search_pokemon']"))).send_keys("pika")
    wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@class='filter_checkbox'][not(@style)]//label"))).click()
    # count = 0
    wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'pokemon_icon_img')))
    pokeList = driver.find_elements(By.CLASS_NAME, 'pokemon_icon_img')
    for poke in pokeList:
        # count += 1
        try:
            poke.click()
            links.append(driver.find_element(By.LINK_TEXT, "Maps").get_attribute('href'))
        except Exception:
            pass
        # if count > 300:
        #     break

    res = []
    for link in links:
        res.append(link.split("=")[1].replace("'", ""))

    # for item in res:
    #     print(item)
    if len(res) > 1:
        saveToKeep(res)
        print("success")
    else:
        print("unsuccessful")
        find_pokemon()

if __name__ == '__main__':
    find_pokemon()
  • 使用Headless Chromium 选项,希望实现更好的性能.
  • 注解掉'count',以防我想限制列表结果(目前我得到像15个结果时,无限的顶部

虽然还有很多...奇怪的:()

  • 现在需要下面的代码wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'pokemon_icon_img'))),因为它并不总是

立刻显示图标,要么这样,要么添加一个常量
时间延迟。

  • 使这个方法递归,以防不成功(有时它仍然给出异常)
  • 最后,saveToKeep(res)方法是我用来打开google keep notes并将结果写入google keep notes的一个简单方法,需要在google安全设置中获得一个应用密码,我用它和我的google账户凭证一起登录。

欢迎任何意见或改进意见:D

相关问题