Selify在主窗口中找不到元素

ctehm74n  于 2022-10-02  发布在  Java
关注(0)|答案(3)|浏览(143)

我正在尝试从一个网站下载一个文件,使用的是Selify和Python3。这需要在覆盖窗口上按一个确认按钮。覆盖窗口不在IFRAME中--当覆盖出现时,只会动态添加HTML--但是Selify不能通过XPath找到按钮,返回一个NoSuchElementException。我是否遗漏了一些东西,可能会导致Selify无法看到元素在页面源代码中出现的样子?据我所知,Selify应该能够毫不费力地找到按钮。


# Initialize Driver

driver = webdriver.Safari()

cmd = "osascript -e 'tell application "Safari" to set bounds of front window to {0, 22, 1500, 1022}'"
os.system(cmd)

# Call up seach link

driver.get(data_url)

wait_a = WebDriverWait(driver, 15)
element = wait_a.until(EC.presence_of_element_located((By.ID, "md-input-3")))

# Initialize and send login information (defined above)

username = driver.find_element_by_id("md-input-3")
password = driver.find_element_by_id("md-input-6")

username.send_keys(crunchbase_username)
password.send_keys(crunchbase_password)

# Click login button

password.send_keys(Keys.ENTER)

# Wait for results page to finish loading

wait = WebDriverWait(driver, 15)
element = wait.until(EC.title_contains("Signals"))

time.sleep(2)

# Press Download Button

driver.find_element_by_xpath("//button[@aria-label='Export your results']").click()
time.sleep(2)

# Press csv button

driver.find_element_by_xpath("//button[@aria-label='Export to CSV']").click()
time.sleep(2)

# Confirm downlaod

driver.find_element_by_xpath("//*[@id='cdk-overlay-36']/md-dialog-container/confirmation-dialog/dialog-layout/div/md-dialog-actions/div/button[2]").click()

# Close driver

# driver.close()

页面源代码过于复杂和高度风格化,所以我不会在这里包括它,但下面是我的浏览器Web检查器中相关代码部分的屏幕截图。我尝试单击的元素以蓝色突出显示。

Web Inspector Screenshot

我很感激在这方面的任何帮助。

xxslljrj

xxslljrj1#

如果不能访问有问题的页面并能够看到正在发生的事情,就很难判断。以下是几个基本要点:

1.尝试使用CSS选择器,而不是XPath。它们更健壮,更容易使用,速度也更快。
1.使用动态生成的ID取消。在你的屏幕截图中,我甚至看不到你的代码中出现的ID。
1.当您有多个相同类型的元素(如本例中的按钮)时,尝试获取某个父元素下的所有webelement,并测试它们是否具有您正在寻找的属性值。

例如:

elemItems = driver.find_elements_by_css_selector(menuItemSelector)

for element in elements:
    if element.text == "export":
        elemItems[1].click()

在这里,您可以找到特定类型的所有元素(例如按钮),并选择其中包含“导出”文本的元素。

qojgxg4l

qojgxg4l2#

在单击该元素之前,请执行以下行:

WebElement element = driver.findElement(By.xpath(" path_of_your_module "));
((JavaScriptExecutor) driver). executeScript("argument[0].scrollIntoView(true);", element);
wfypjpf4

wfypjpf43#

我在对话覆盖上遇到了同样的问题,我修复了它。我意识到,在单击将显示覆盖图的覆盖图按钮时,Selify将在覆盖图加载动态内容之前搜索元素。所以我这样做了:

def download():
    global browser
    notFound = True
    while(notFound):
        try:

            elem = browser.find_element(By.ID, 'btnFormat2')
            elem.click()
            notFound = False
        except BaseException:
            print("----Error Download Element not found")

download()

代码将持续查找该元素,直到其加载到覆盖图上。

相关问题