当前位置: 首页 > 知识库问答 >
问题:

硒包含无法在对话框中找到元素的文本

燕俊明
2023-03-14

我需要清理一个包含列表的网站。单击任何列表元素都会显示一个模式对话框,其中包含一些我想要删除的文本。在循环中这样做会导致过时的元素异常,所以这就是我最初做的

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打印正确的文本。网页结构如下:

<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)

以下是我收到的错误片段:

代码运行时出错

共有1个答案

钦高峯
2023-03-14

你可以尝试几件事-我认为你的引号可能会有点混乱的语法,但如果这是问题,我不知道为什么它会为第一个循环工作......

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

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

这两个定义中的任何一个更好吗?

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

编辑以回应OP的澄清:“我需要单击所有带有数据切换的标签='modal'”

对我来说,以下xPath返回20

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

 类似资料:
  • [[Img1][Img2[Img3]我试图通过链接文本获取元素。但是低于例外。异常在线程"main"org.openqa.selenium.NoSuchElement异常:没有这样的元素:无法定位元素:{"方法":"链接文本","选择器":"CFDSDSR"} 我尝试切换到帧,但它给出了未找到的帧,但该帧存在: XPath: /html/body/table/tbody/tr/td/form/ta

  • 我正在尝试使用Chrome、Selenium和c#在Sitecore 8.1中运行一些自动化测试。我的代码不想在Sitecore页面中找到任何元素,特别是体验编辑器。我遇到“无法定位元素”警告。 例如:我想要的项目。单击()是工具栏功能区按钮,用于显示工具栏菜单。这是元素: 这是它的 X 路径: /html/body/div/div/div[1]/nav[1]/a[3] 我已经延长了等待时间以使其

  • 任何提示都会很有帮助!

  • 大家好,我正试图在网站中找到一个元素,但出于某种原因,它不允许我。该网页是Reddit的登录形式,我尝试输入用户名和密码,但当我列出所有输入时,它只出现在顶部搜索栏中。我想这是因为它就像在另一个“标签”一样,它会弹出到前面,但我不知道如何管理它。提前谢谢。

  • 问题内容: By Company   我需要捕获上述元素的xpath。我尝试了以下替代方法,但在Chrome中似乎没有任何效果。您能否建议其他选择。 问题答案: 要查找元素: 您可以使用以下xpath之一: 使用: 使用: 但是,理想情况下,您可能希望避免使用 NO-BREAK SPACE 字符,并使用以下任一解决方案: 使用: 使用: 参考 您可以在以下位置找到相关的详细讨论: 使用XPATH搜

  • 我试图用Selenium测试一个复杂的JavaScript接口(使用Python接口,跨多个浏览器)。我有多个表单按钮: 我希望能够搜索基于“我的按钮”(或不区分大小写,部分匹配,如“我的按钮”或“按钮”)的按钮。 我发现这是非常困难的,以至于我觉得我错过了一些明显的东西。到目前为止我所拥有的最好的东西是: 但是,这是区分大小写的。我尝试的另一件事是遍历页面上的所有div,并检查Element.T