如何在chrome web驱动程序中获取自定义标记内的元素

时间:2017-10-07 17:09:28

标签: selenium selenium-webdriver webdriver chrome-web-driver

这是我的示例html代码。

<div class="content">
<M class="mclass">
   <section id="sideA">
       <div id="mainContent"> 
           <div class="requestClass"> 
              <span>Check</span>
              <input type="text" id="box">
           </div>
       </div>
   <section>
   <section id="sideB">
      ...
   <section>
</M>
</div>

我想为我的文本字段(“框”)设置一些值。所以我厌倦了设置如下代码

driver.findElement(By.xpath("...")).sendKeys("SetValue");

我的Xpath ID是正确的,它存在于页面中但是我收到此错误

no such element: Unable to locate element: {"method":"xpath","selector":"id("..."}

为什么我因为自定义标记而收到此错误,如果是,如何在自定义标记内获取元素?

3 个答案:

答案 0 :(得分:1)

根据您提供的HTML<input type="text" id="box">所代表的文本字段填写一些值,您可以使用以下任一行代码:

  1. cssSelector

    driver.findElement(By.cssSelector("section#sideA input#box")).sendKeys("SetValue");
    
  2. xpath

    driver.findElement(By.xpath("//section[@id='sideA']//input[@id='box']")).sendKeys("SetValue");
    

答案 1 :(得分:0)

如果您仍想使用XPath。这对我有用 -

 driver.FindElement(By.XPath(@"//*[@id='box']")).SendKeys("AB‌​");

我不认为自定义标记会导致任何问题,因为CssSelector也可以工作 -

driver.FindElement(By.CssSelector(@"m[class='mclass'] input")).SendKeys("AB");

答案 2 :(得分:0)

您可以使用xpathID找到它,我的建议您必须使用ID。也可以使用显式等待元素来显示。

使用WebElement elem= driver.findElement(By.id("box")); WebDriverWait wait=new WebDriverWait(driver, 10); wait.until(ExpectedConditions.visibilityOf(elem)); elem.sendKeys("test"); ,您的代码如下:

JavascriptExecutor

您也可以使用WebElement elem= driver.findElement(By.id("box")); WebDriverWait wait=new WebDriverWait(driver, 10); wait.until(ExpectedConditions.visibilityOf(elem)); JavascriptExecutor myExecutor = ((JavascriptExecutor) driver); myExecutor.executeScript("arguments[0].value='test';", elem);

struct SDL_Event;
struct WindowState;

struct Menu {
    void update (WindowState *) {}
    void render () {}
    void eventHandler (SDL_Event *) {}
};

struct Game {
    void update (WindowState *) {}
    void render () {}
    void eventHandler (SDL_Event *) {}
};

template<typename T, void(T::*)(WindowState *)>
void update(void *ptr, WindowState *winState) {
    static_cast<T *>(ptr)->update(winState);
}

template<typename T, void(T::*)()>
void render(void *ptr) {
    static_cast<T *>(ptr)->render();
}

template<typename T, void(T::*)(SDL_Event *)>
void eventHandler(void *ptr, SDL_Event *event) {
    static_cast<T *>(ptr)->eventHandler(event);
}

struct {
    void (*update) (void *, WindowState *);
    void (*render) (void *);
    void (*eventHandler) (void *, SDL_Event *);
    void *instance;
} routines;

template<class T>
void switchRoutines (T *obj) {
    routines.update = &update<T, &T::update>;
    routines.render = &render<T, &T::render>;
    routines.eventHandler = &eventHandler<T, &T::eventHandler>;
    routines.instance = obj;
}

int main() {
    Game game;
    switchRoutines<Game> (&game);
    routines.render (routines.instance);
}