【问题标题】:selenium contains text not able to find the element in a dialog boxselenium 包含无法在对话框中找到元素的文本
【发布时间】:2021-12-11 04:14:49
【问题描述】:

我需要抓取一个包含列表的网站。单击任何列表元素会显示一个模式对话框,其中包含我要抓取的一些文本。在循环中执行此操作会产生陈旧元素异常,所以这就是我最初所做的

elems = browser.find_elements_by_xpath("//a[@data-toggle='modal']")
temp_names = []
for elem in elems:
    temp_names.append(elem.text)

单击此锚标记元素会显示模态对话框,因此我将所有这些元素的文本存储在一个列表中,最后我这样做了:

for temp_name in temp_names:
    print(temp_name)
    modals= browser.find_element_by_xpath("//a[contains(text(),'"+temp_name+"')]")
    modals.click()
    time.sleep(1)
    # rest of the scraping code

现在即使 temp_name 打印正确的文本,我也会收到 No element exception 错误。网页结构如下:

<div class="...">
    <h4 class="...">
        <a href=# data-toggle="modal" data-target="#(target modal dialogue id)">Text</a>
    </h4>
    .   .   .
    (Some Other tags)
    .   .   .
</div>
<div id =(modal dialogue id) class="..." role="dialog">
    .   .   .
    (Some text I want to Scrape)
    .   .   .    
</div>

锚标记中的文本是我正在寻找的文本。我计划通过文本查找元素,然后单击它,然后在循环结束时使用 browser.get(URL) 返回到原始 url,并再次找到第二个元素,依此类推。 我不明白为什么它无法找到元素,因为我刚刚在上一个循环中获得了元素文本。另外,如果有更好的方法,请分享。

注意:除非我先点击,否则我不能直接从模态对话框 div 中抓取,否则返回的文本将为空。

编辑:

以下是我当前的代码:

chromedriver = 'C:\\chromedriver.exe'
chop = webdriver.ChromeOptions()
chop.add_extension('C:\\AdBlock_v3.38.1.crx')
time.sleep(5)
browser = webdriver.Chrome(chromedriver, chrome_options = chop)


for i in range(1,22):
    browser.get("http://pasha.org.pk/members/page/"+str(i)+"/")
    time.sleep(1)
    elems = browser.find_elements_by_xpath("//a[@data-toggle='modal']")
    print(len(elems))
    temp_names = []
    for elem in elems:
        temp_names.append(elem.text)
    current = browser.current_url
    for temp_name in temp_names:
        print()
        print(temp_name)
        print()
        modals= browser.find_element_by_xpath(f"//a[contains(text(), '{temp_name}')]")
        modals.click()
        time.sleep(1)
        # elem2 = browser.find_element_by_xpath("//button[@class='close']")
        # time.sleep(1)
        browser.get(current)

以下是我得到的错误的 sn-p:

Error when code runs

【问题讨论】:

    标签: python selenium


    【解决方案1】:

    您可以尝试几件事-我认为您的引号可能会稍微弄乱语法,但是如果这是问题所在,我不确定为什么它会在第一个循环中起作用....

    modals= browser.find_element_by_xpath(f"//a[contains(text(), '{temp_name}')]")
    
    modals= browser.find_element_by_xpath("//a[contains(text(), '" + temp_name + "')]")
    

    这些定义中的任何一个都更有效吗?

    如果没有,您能否上传您收到的完整错误文本?

    编辑以解决 OP 的说明:“我需要点击所有带有 data-toggle='modal' 的标签”

    对我来说,以下 xPath 返回 20 个 &lt;a&gt; 元素和 data-toggle='modal'

    modals= browser.find_element_by_xpath("//a[@data-toggle='modal']")
    

    【讨论】:

    • 两者都给出相同的错误。我在编辑部分添加了sn-p。我不明白为什么第一个循环会找到它,而紧随第一个循环的第二个循环无法找到它。难道是它必须做一些事情来找到锚标签的文本
    • 这将有助于确认一些可能的问题,如果可以的话,请分享 HTML。网址通常一样好,但对我个人而言,我现在在移动设备上,无法在浏览器中看到开发控制台!
    • 任何时候你都有空。我已经添加了我的代码和网址
    • 我仍然希望查看完整的 HTML 以确认您的 xpath 是否正确,但假设它是正确的,我愿意打赌您要查找的元素位于某种框架或 iFrame 内,并且您需要在选择元素之前将上下文切换到该上下文。
    • 您能否至少显示包含您要查找的元素的整个 div?
    猜你喜欢
    • 2018-08-01
    • 1970-01-01
    • 2015-09-19
    • 2017-11-25
    • 2012-09-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2013-09-16
    相关资源
    最近更新 更多