javascript - 带有 Selenium 的 Python : Click intercepted and finding different span classes

标签 javascript python html selenium automation

我正在尝试编写一个这样工作的程序:

  1. 转到主页
  2. 单击列表中的第一项(所有项都以“item-”开头),这会将我带到下一页。
  3. 找到一个带有“A”的按钮并点击它。
  4. 找到“确认”按钮并点击它。
  5. 返回,同样处理第 2 项、第 3 项等。

我有两个问题。首先,上面带有“A”的按钮有时会包含比简单的“A”更多的文本,例如。 “A”与“123”脚注。我不太了解 HTML,但这会导致不同的 span 和 div 类:

<div class="selectOne">
    <span class="selectObject-no-footnote">A</span>
</div>

<div class="selectOne-with-footnote">
    <span class="selectObject">A</span>
        <span class="selectFootnote">
            <span>123</span>
        </span>
</div>

它们永远不会在同一页面上,但在我的解决方案中,“A”按钮并不总是被按下。很难说是因为我的解法不对还是来自第二个问题。通常(这是随机的)当我进入带有按钮的页面时,一些横幅从页面顶部滚落,整个网站以我的“确认”按钮看不见的方式移动。我解决它的方法是每次都向下滚动网站,然后才开始寻找按钮。那么横幅是否向下滚动并不重要,因为在这两种情况下按钮“A”和“确认”都是可见的。但是,我仍然没有 100% 的准确性,而且我有时会遇到 click intercepted 异常。我的代码:

i=0
a=1
while True:
    WebDriverWait(driver, 1).until(EC.element_to_be_clickable((By.XPATH, "//*[starts-with(@id, 'item-')]")))
    items = driver.find_elements_by_xpath("//*[starts-with(@id, 'item-')]")
    try:
        items[i].click()

        try:
            try:
                driver.execute_script("window.scrollTo(0, 250)")
                WebDriverWait(driver, 1).until(EC.element_to_be_clickable((By.XPATH,"//span[@class='selectObject-no-footnote'][contains(text(),'A')]")))
                driver.find_element_by_xpath("//span[@class='selectObject-no-footnote'][contains(text(),'A')]").click()
            except Exception as e:
                a = 0
                print(e)


            if a==0:
                driver.execute_script("window.scrollTo(0, 250)")
                WebDriverWait(driver, 1).until(EC.element_to_be_clickable((By.XPATH, "//span[@class='selectObject'][contains(text(),'A')]")))
                driver.find_element_by_xpath("//span[@class='selectObject'][contains(text(),'A')]").click()
                a=1

            WebDriverWait(driver,1).until(EC.element_to_be_clickable((By.ID, 'confirm')))

            driver.find_element_by_id('confirm').click()
        except Exception as e:
            print(e)

        i += 1

        driver.back()

    except IndexError:
        print(items)
        print(i)

        break

是否有不同的工具可以做到这一点,而不必担心元素被某些东西覆盖或超出窗口? (好斗?)

最佳答案

整体逻辑是正确的。我建议进行两个更改,(这是在 JAVA 中)

1) 使用以下 xpath 查找带有文本 A 的按钮。这应该适用于两种情况(A 或 A123)

WebElement button = driver.findElement(By.xpath("//span[contains(@class,'selectObject')][contains(text(),'A')]");
button.click();

2) 您可以向下滚动到该元素并等到上面的元素在页面上可见且可点击。

((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", button);

关于javascript - 带有 Selenium 的 Python : Click intercepted and finding different span classes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56958779/

相关文章:

javascript - 加载新的 JSON 数据并替换 VueJS 中的旧数据

javascript - meteor Android 应用程序无法连接到服务器

python - twisted reactor.spawnProcess 在 Windows 上获取无缓冲的标准输出

python - 长参数列表和性能

python - 如何在 matplotlib 中插入颜色以使其数量加倍

javascript - 如何在输入文本上显示 QR 扫描结果

javascript - 在 PhoneGap 浏览器中存储用户数据

javascript - 如何创建具有第 3 级的垂直导航菜单?

python - 从 Python 中的任何站点抓取链接标题的一般方法?

html - 如何阻止 Chrome 自动完成文本区域?